@cxm-2016
2016-11-21T04:11:41.000000Z
字数 1383
阅读 3768
OpenGL-ES
版本:1
作者:陈小默
声明:禁止商业,禁止转载
上一篇:OpenGL-ES 3.0学习指南(一)——Hello NDK
第三章我们介绍了Java如何调用JNI的方法,本章我们就来学习如何在JNI中回调Java的方法。这里我们仍按照第三章的思路进行编写。本章内容是编写一个Activity,其中有一个TextView,当对TextView进行点击的时候,由JNI记录点击次数,并将结果显示在TextView上。
在这里我们将native方法与Activity写在一个类中
public class HelloJavaActivity extends AppCompatActivity {private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_jni_callback);tv = (TextView) findViewById(R.id.tv_jni_callback);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {callback();}});}public void setText(int count) {tv.setText("" + count);}public native void callback();}
接下来创建源文件hello-java.cpp,以下代码中所有函数在JNI完全指南系列均有详解。
#include <jni.h>static int count;extern "C"JNIEXPORT void JNICALLJava_com_github_cccxm_ndk_view_HelloJavaActivity_callback(JNIEnv *env,jobject activity) {jclass activityClass = env->GetObjectClass(activity);jmethodID method = env->GetMethodID(activityClass, "setText", "(I)V");env->CallVoidMethod(activity, method, count += 1);}
add_library(ndk-lib SHAREDsrc/main/cpp/hello-jni.cppsrc/main/cpp/hello-java.cpp)
通过本章的过程,我们能够实现一个点击计数器的效果。在JNI中操作Java对象的方式跟Java中的反射过程类似。
