2016-07-22 31 views
0

,当我在看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!

回答

1

,你可以在你的本地代码声明回调

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

然后从Java代码,只是声明为本地

native void nativeCallback(); 

请记住,这执行在主线程,你应该送命令到后台线程进行处理。

此致敬礼。

+0

不以“胶水”的工作看我下面的帖子 – gmmo

+1

在您的主要活动的创建方法加载你的库,例如 保护无效onCreate(Bundle savedInstanceState){ ... System.loadLibrary(“MoreTeapotsNativeActivity”); ... } –

+0

工作!谢谢! – gmmo

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__)