Java方法调用两次从c++ JNI NDK函数

Java method called twice from C++ JNI NDK function

本文关键字:c++ JNI NDK 函数 两次 调用 方法 Java      更新时间:2023-10-16

我有一些c++ NDK代码通过JNI调用Java方法。问题是我的Java方法被调用了两次。似乎一旦我使用GetMethodID获得方法的句柄,然后调用env->NewObject w/该方法ID,我的java函数被调用。

当我调用env->CallVoidMethod(obj, mid)时,它再次被调用,这是预期的。我只是不确定为什么它被称为当我创建一个新对象?

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必须通过调用GetMethodID()和作为方法名,void (V)作为返回类型。