使用android_native_app_glue.c

时间:2016-07-22 23:35:43

标签: c++ android-ndk

我正在查看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粘合的钩子,只有从胶水到java。我相信胶水正在自己的线程中运行。

任何线索?

THX!

2 个答案:

答案 0 :(得分:1)

您可以在原生代码中声明回调

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

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

native void nativeCallback();

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

最好的问候。

答案 1 :(得分:0)

这与“胶水”不起作用。如果你看一下我提到的样本,就会有所不同。它使用胶水。所以我添加了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__)
相关问题