我有一些 C++ NDK 代码通过 JNI 调用 Java 方法。我遇到的问题是我的 Java 方法被调用了两次。似乎一旦我使用 GetMethodID 获得该方法的句柄,然后调用带有该方法 ID 的 env->NewObject,我的 java 函数就会被调用。
当我调用预期的 env->CallVoidMethod(obj, mid) 时,它又被调用了。我只是不确定为什么在创建 NewObject 时会调用它?
C++ Code:
---------
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
jvm = vm;
start();
return JNI_VERSION_1_6;
}
void start() {
JNIEnv *env = NULL;
jvm->GetEnv((void**)&env, JNI_VERSION_1_6);
jclass cls = env->FindClass("com/test/Test");
jmethodID mid = env->GetMethodID(cls, "StartApp", "()V");
jobject obj = env->NewObject(cls, mid);
if (mid != 0){
env->CallVoidMethod(obj, mid);
}
}
Java Code:
----------
public void StartApp(){
android.util.Log.e("Test", "Java Method Called from Native");
}
最佳答案
NewObject以构造函数为参数,所以
jobject obj = env->NewObject(cls, mid);
这将调用第一个 StartApp()
,但请注意,由于它不是正确的构造函数,这会给您带来麻烦。
对于构造函数,根据手册,这个ID必须通过以
关于从 C++ JNI NDK 函数调用两次的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25123942/