使用android_native_app_glue.c时,我可以从java调用本机代码吗

Can I call native code FROM java when using android_native_app_glue.c

本文关键字:我可以 java 本机代码 调用 native android app glue 使用      更新时间:2023-10-16

我正在查看MoreTeapots示例:

https://github.com/googlesamples/android-ndk/tree/master/MoreTeapots

我发现使用android_native_app_glue.C从C++代码中调用Java方法很容易,方法是:

jclass clazz = jni->GetObjectClass(app_->activity->clazz);
jmethodID methodID = jni->GetMethodID(clazz, "updateCamera", "(FFF)V");
jni->CallVoidMethod(app_->activity->clazz, methodID, x, y, z);

然而,我能在那个样本中做相反的操作吗?

将一个函数声明为java代码,并调用本机代码。请注意,样品使用"胶水";因此,答案不只是这些步骤:

https://developer.android.com/ndk/samples/sample_hellojni.html

这是不同的。我没有看到从java到glue的钩子,只有从glue到java的钩子。我相信胶水是自己流出来的。

有线索吗?

thx!

您可以在本地代码中声明回调

JNIEXPORT void JNICALL Java_package_Activity_nativeCallback(JNIEnv* jenv, jobject obj);

然后从Java代码中,刚刚声明为本地

native void nativeCallback();

请记住,这是在主线程中执行的,您应该向后台线程发送一个命令进行处理。

致以最良好的问候。

这对"胶水"不起作用。如果你看看我提到的样品,那就不一样了。它使用胶水。所以我在java代码中添加了:

public native void nativeCallback();

然后转为本地:

extern "C" {
JNIEXPORT void JNICALL Java_com_sample_moreteapots_MoreTeapotsNativeActivity_nativeCallback(JNIEnv *env, jobject obj);
};
JNIEXPORT void JNICALL Java_com_sample_moreteapots_MoreTeapotsNativeActivity_nativeCallback(JNIEnv *env, jobject obj) {
int i = 0;
return;
}

它进行了编译和链接。但当我试图从Java调用该方法时,我得到了以下信息:

FATAL EXCEPTION: main
Process: com.sample.moreteapots, PID: 31733 
java.lang.UnsatisfiedLinkError: No implementation found for void com.sample.moreteapots.MoreTeapotsNativeActivity.nativeCallback()
(tried Java_com_sample_moreteapots_MoreTeapotsNativeActivity_nativeCallback
and Java_com_sample_moreteapots_MoreTeapotsNativeActivity_nativeCallback__)