Основное различие между вызовами JNI в C и CPP заключается в следующем:
JNI в стиле C выглядит
(* env) -> SomeJNICall (env, param1 ...)
JNI в стиле C ++ выглядит
env-> SomeJNICall (param1 ...)
, чтобы преобразовать его в CPP, вам нужно сделать
Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj)
{
jclass cls = env->GetObjectClass(obj);
jmethodID mid = env->GetMethodID(cls, "callback", "()V");
if (mid == NULL) {
return; /* method not found */
}
printf("In C++\n");
env->CallVoidMethod(obj, mid);
//rest of your code
Также убедитесь, что ваши функции JNI соответствуют соглашению об именах.
Пример:
JNIEXPORT jint JNICALL Java_com_shark_JNITestLib_JNITestLib_startServer(JNIEnv* env, jobject o, jstring inputName, jstring streamName, jstring description) {
Вы можете видеть, что соглашение
Java_ (имя пакета) _ (имя класса) _ (имя метода)
, так как вышеупомянутый использовался в классе как
package com.shark.JNITestLib
import java.util.stuff;
public class JNITestLib
{
static
{
System.loadLibrary("myJNIlib");
}
public native synchronized int startServer(String inputName, String streamName, String description);
//more class stuff...
}
При работе с JNI я решил, что имя класса, содержащего вызовы JNI, должно совпадать с именем пакета. Вот почему вы видите JNITestLib дважды (и именно поэтому мой JNI работает сразу, потому что я всегда забываю, как правильно называть вызовы JNI)
Ура, надеюсь, я помог:)