Как передать экземпляр класса Java в качестве параметра для метода JNI? - PullRequest
11 голосов
/ 17 декабря 2010

Я хотел бы передать объект класса java методу JNI, и я хочу вызвать несколько методов в методе JNI, как показано ниже.

Есть ли кто-нибудь, у кого есть пример, подобный приведенному ниже?

class JavaClassParameter{
    void javaMethodTobeCalledInJNI(){
        ...java source...
    }
}

class MainJavaClass{
    void somemethod(){
        JavaClassParameter object = new JavaClassParameter();
        JNIMethod(object);
    }

    native void JNIMethod(JavaClassParameter object);
}


// C++ code
void JNIMethod(object){
    object->javaMethodTobeCalledInJNI();
}

1 Ответ

15 голосов
/ 17 декабря 2010

Объявление вашего метода:

class MainJavaClass {
    native void JNIMethod(JavaClassParameter object);
}

означает javah должно генерировать предварительное объявление, подобное следующему:

JNIEXPORT void JNICALL Java_MainJavaClass_JNIMethod(JNIEnv* env, jobject mainJavaClass);

В реализации этого у вас естьнесколько вещей, которые нужно сделать:

Найти JavaClassParameter

Использовать FindClass, который принимает строковое имя:

jclass cls = env->FindClass("JavaClassParameter");

Найти javaMethodTobeCalledInJNI ()

Используйте GetMethodID, который проверяет класс, имя строки метода и его подпись.Поскольку это пустая функция без аргументов, ее сигнатура просто ()V:

jmethodID method = env->GetMethodID(cls, "javaMethodTobeCalledInJNI", "()V");

Вызовите javaMethodTobeCalledInJNI ()

Используйте CallVoidMethod, что требуетэкземпляр объекта, идентификатор метода и любые аргументы (в данном случае ни одного):

env->CallVoidMethod(mainJavaClass, method);

Вы должны проверять NULL-результаты после каждого шага;если вы возвращаете NULL из одной функции JNI и передаете ее другой, вы обычно будете аварийно завершать работу JVM

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