我有一些C ++ NDK代码通过JNI调用Java方法。我遇到的问题是我的Java方法被调用了两次。似乎一旦我使用GetMethodID获取方法的句柄,然后调用env-> NewObject w /那个方法ID,我的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");
}
答案 0 :(得分:3)
NewObject将构造函数作为参数,所以
jobject obj = env->NewObject(cls, mid);
这会调用第一个StartApp()
,但请注意,由于它不是一个合适的构造函数,这会给您带来麻烦。
对于构造函数,根据手册,必须通过使用<调用GetMethodID()获取此ID。 init>作为方法名称和void(V)作为返回类型。