Вызов Java из C с использованием JNI - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь следующий код для вызова функции Java executeSHA () из кода C. Но я продолжаю получать сообщение об ошибке «запрос на членство« DestroyJavaVM »в чем-то, что не является структурой или объединением». Я проверил несколько ссылок в Интернете и, кажется, я использую его, как уже упоминалось.

JavaVM *jvm;       
JNIEnv *env;      
JavaVMOption options[3];
JavaVMInitArgs vm_args; 
vm_args.version  = JNI_VERSION_1_2;

JNI_GetDefaultJavaVMInitArgs(&vm_args);
options[0].optionString = "/home/amy/jni/";
vm_args.options  = options;

JNI_CreateJavaVM(&jvm, &env, &vm_args);
jclass cls = (*env)->FindClass(env, "CallToBCLib");
jmethodID mid = (*env)->GetStaticMethodID(env, cls, "performSHA", "ILjava/lang/String;");
(*env)->CallStaticVoidMethod(cls, mid, algo_id, tc->m1);
jvm->DestroyJavaVM();   <-- ERROR

Также правильно ли использовать FindClass, GetStaticMethodID и CallStaticVoidMethod? executeSHA - это функция Java, которую я вызываю, а algo_id, tc-> m1 - мои аргументы функции Java ...

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Это слишком долго, чтобы быть в комментарии, поэтому я поставлю это как ответ. Я проверил, как вы должны получить доступ к DestroyJavaVM в исходном коде jni:
Функция определена здесь , и это объявление:

jint JNICALL jni_DestroyJavaVM(JavaVM *vm)

В нижней части этой страницы находится таблица вызова функций для использования в исходном коде языка C.

Спецификация дает нам определение типа JavaVM здесь .
Мы можем видеть, что определение типа JavaVM - это сама таблица вызова функций.

Это означает, что нам нужно взять нашу переменную jvm и получить доступ к ее функции DestroyJavaVM,
одновременно передавая сам экземпляр jvm, поэтому код доступа должен выглядеть следующим образом:

jvm->DestroyJavaVM(jvm);

Я не проверял это, и немного странно вызывать такую ​​функцию, но я предполагаю, что это должно сработать.

0 голосов
/ 03 декабря 2018

Я решил это, выполнив следующее:

(*jvm)->DestroyJavaVM(jvm);
0 голосов
/ 05 ноября 2018

Согласно документации , вы должны предоставить параметр типа JavaVM *vm для функции DestroyJavaVM:

jint DestroyJavaVM(JavaVM *vm);

Поэтому замените jvm->DestroyJavaVM() на DestroyJavaVM(jvm).

Обратите внимание, что на той же странице есть «Обзор» с примером, где DestroyJavaVM() вызывается как в вашем коде (jvm->DestroyJavaVM()), но это относится к C ++, и вы упомянули, что пытаетесь вызывать код Java из C .

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