У меня есть следующее простое приложение jni:
jobjectArray ListItems(JNIEnv *env, jobject self, jstring library)
{
jclass c = env->FindClass("java/lang/String");
jobjectArray a = env->NewObjectArray(2, c, 0);
env->SetObjectArrayElement(a, 0, env->NewStringUTF("text1"));
env->SetObjectArrayElement(a, 1, env->NewStringUTF("text2"));
return a;
}
int main()
{
...
...*load and initialize Java VM and JNI interface*
...
JNINativeMethod m[1];
m[0].fnPtr = ListItems;
m[0].name = "listItems";
m[0].signature = "(Ljava/lang/String;)[Ljava/lang/String;";
env->RegisterNatives(myJavaClass, m, 1);
}
когда я компилирую код, как показано ниже, он дает мне «ошибку: недопустимое преобразование из jobjectarray * в void *»
g++ -I"JNI\include" -I"JNI\include\win32" test.cpp -o test.exe
как сказал @Michael, просто нужен кастинг void*:
int main()
{
...
...*load and initialize Java VM and JNI interface*
...
JNINativeMethod m[1];
m[0].fnPtr =(void*) ListItems;
m[0].name = "listItems";
m[0].signature = "(Ljava/lang/String;)[Ljava/lang/String;";
env->RegisterNatives(myJavaClass, m, 1
}
Вы не можете просто передать это
void*
? Обратите внимание, что это связано с некоторыми оговорками, см., например. stackoverflow.com/questions/60064078/…