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

标签 java android c++ android-ndk java-native-interface

我有一些 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必须通过以为方法名,void(V)为返回类型调用GetMethodID()获取。

关于从 C++ JNI NDK 函数调用两次的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25123942/

相关文章:

java - 运行时结构可以在开放 MPI 中使用吗?

java - 从接收者的 Intent 中获取额外信息时出现 NullPointerException。仅限华为设备

java - Android,位置请求作为后台服务,并将其发送到网络

android - 如何解决构建路径错误?

c++ - 我可以使用迭代器访问优先级队列的元素吗?

c++ - Ceres 求解器的束调整

java - Nutch 2.4 注入(inject)出现运行时异常

java - Spring boot - 错误的 TCP 连接处理

java - 在java中从JDBC连接到MySql

c++ - 在 C++ 中检测击中 Enter 键