Как получить объект Java из вызова JNI (C ++)? - PullRequest
2 голосов
/ 21 марта 2012

Я немного исследовал, как делать вызовы JNI из C ++ в Java, и до сих пор у меня не было никаких проблем, мне удалось вызвать почти любой тип функции.Я говорю ПОЧТИ, потому что сейчас я сталкиваюсь с такой ситуацией:

В Java у меня есть эта функция:

public static Object getJObject(int id){
    Object st = null;
    switch (id){
        case 0: st = "hello"; break;
        case 1: st = "bye"; break;
        case 2: st = 1; break;
        case 3: st = 2; break;
        case 4: st = 3; break;
    }
    return st;
}

Как видите, эта функция возвращает значение другого типаучитывая идентификатор, полученный в качестве параметра.

Проблема возникает при попытке получить этот объект из C ++.Вот функция, которая делает вызов JNI:

bool check(){
    JniMethodInfo methodInfo;
    jobject jobj;

    bool b = getStaticMethodInfo(methodInfo, "org.example.act.activity", "getJObject", "()Ljava/lang/Object;");

    if (!b){
        CCLog("getJObject method not found");
        return false;
    }else{
        jobj = methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID, 0);
        return true;
    }
}

ПРИМЕЧАНИЕ: (хотя я думаю, что это очевидно), обратите внимание, что метод getStaticMethodInfo устанавливает весь процесс идентификации методав классе Java.Он работает с любой другой функцией, которую я вызываю, кроме этой.

Это единственное, что я хочу сделать ... Я почти уверен, что это что-то в сигнатуре, указывающей типЭто так, но, возможно, я ошибаюсь.До сих пор я нашел ответы на вопросы о получении объекта класса или строк, но я не нашел ничего в правильном Java-объекте ...

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Подпись, которую вы предоставляете getStatiticMethodInfo, не соответствует методу.Для метода, который принимает аргумент int и возвращает Object, подпись должна быть: (I)Ljava/lang/Object;

IIRC, синтаксис подписи метода описан в нескольких местах, включая:

  • спецификация JNI, а
  • спецификация JVM
1 голос
/ 21 марта 2012

Дважды проверьте правильность имени пакета и класса и соответствие подписи выводу javap -s.

Но это ужасный дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...