我尝试将回调机制从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调用,但此时崩溃...)
1条答案
按热度按时间8hhllhi21#
问题解决了。
我在Gradle文件中添加以下代码:
我还将我的.so文件复制到'src/main/jniLibs/[platform]/'目录。
平台:arm 64-v8 a,armeabi-v7 a,x64,x86。