我可以从Java调用本机代码使用android_native_app_glue.c
问题描述:
,当我在看MoreTeapots样本:我可以从Java调用本机代码使用android_native_app_glue.c
https://github.com/googlesamples/android-ndk/tree/master/MoreTeapots
,我看到,很容易调用使用android_native_app_glue的C++代码的Java方法。 c通过使用此方法:
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到Java的钩子,只能从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__)
不以“胶水”的工作看我下面的帖子 – gmmo
在您的主要活动的创建方法加载你的库,例如 保护无效onCreate(Bundle savedInstanceState){ ... System.loadLibrary(“MoreTeapotsNativeActivity”); ... } –
工作!谢谢! – gmmo