java 如何在JNI中注册natives并使用其功能

monwx1rj  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(79)

我尝试将回调机制从Java实现到C++。
首先,我从C++启动了一个带有Intent的Android Activity,代码如下:

jclass class_intent = env->FindClass("android/content/Intent");
jmethodID newIntent = env->GetMethodID(class_intent, "<init>", "()V");
jobject intent = env->NewObject(class_intent, newIntent);
jstring actionString = env->NewStringUTF("GET_VERSION");
jmethodID setAction = env->GetMethodID(class_intent, "setAction", "(Ljava/lang/String;)Landroid/content/Intent;");
env->CallObjectMethod(intent, setAction, actionString);
jmethodID startActivityMethod = env->GetMethodID(ccloc, "startActivity", "(Landroid/content/Intent;)V");
env->CallVoidMethod(activity, startActivityMethod, intent);

Activity已成功启动,但没有返回Activity的结果,因此需要实现回调机制。
我尝试创建一个新的函数:

void myFunc(JNIEnv* env, jobject obj) {
    Logger::Instance().LogInfo(L">>> AddInNative.myFunc");
}

这个函数可以帮助获取已启动活动的结果。我使用JNI将这个函数注册为本地函数:

static JNINativeMethod native_methods[] =
{
    { "myFunc", "()V",  (void*)&myFunc}
};
jint res = env->RegisterNatives(ccloc, native_methods, 1);

所以,在这个例子中,res等于0(注册成功)。我还检查了注册的正确性:

jmethodID check = env->GetMethodID(ccloc, "myFunc", "()V");

因此,方法“Check”已找到。因此,该方法的注册成功。
现在我尝试在我的Java-activity中调用这个函数:

public native void myFunc();
public void FinishActivity(boolean success, Intent intent) {
    Log("FinishActivity");
    setResult(success ? RESULT_OK : RESULT_CANCELED, intent);
    if (mService != null)
        mService.stopSelf();
    Log("Callbacking...");
    try {
        myFunc();
        Log("Callbacked.");
    }catch(Exception e){
        Log("Exception of callback");
    }
    finish();
}

程序在myFunc调用位置停止。它被记录为“Callbacking...”,但没有记录为“Callbacked.”或“Exception of callback”。
请帮助。为什么myFunc没有被调用?(mb调用,但此时崩溃...)

8hhllhi2

8hhllhi21#

问题解决了。
我在Gradle文件中添加以下代码:

sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

我还将我的.so文件复制到'src/main/jniLibs/[platform]/'目录。
平台:arm 64-v8 a,armeabi-v7 a,x64,x86。

相关问题