2020-04-16
-
c层调用java层的普通函数和静态函数
- 在布局文件中新增两个按钮
<Button android:id="@+id/btn_call_normal_method" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="调用普通方法" /> <Button android:id="@+id/btn_call_static_method" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="调用静态方法" />
- 修改MainActivity.java中点击事件处理
//在onCreate函数中添加注册事件处理函数 ((Button)findViewById(R.id.btn_call_normal_method)).setOnClickListener(mOnClickListener); ((Button)findViewById(R.id.btn_call_static_method)).setOnClickListener(mOnClickListener); //然后创建事件处理的mOnClickListener private View.OnClickListener mOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_click: setString(); break; case R.id.btn_show: showNormalAndStaticString(); break; case R.id.btn_call_normal_method: callNormalMethod(); break; case R.id.btn_call_static_method: String result = callStaticMethod(); Toast.makeText(MainActivity.this, "调用结果:"+result, 2000).show(); break; default: break; } } };
- 创建两个native函数,
//jni层调用普通函数 public native void callNormalMethod(); //jni层调用静态函数 public native String callStaticMethod();
- 创建两个函数,用于被jni层调用
public void normalMethod() { Toast.makeText(this, "我是普通方法", 2000).show(); } public static void staticMethod() { Toast.makeText(mThis, "我是静态方法", 2000).show(); }
- 为了能够在staticMethod函数中使用context,这里需要申明一个静态的mThis,在onCreate中赋值this
private static MainActivity mThis = null; //在onCreate函数中 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toast.makeText(this, getString(), Toast.LENGTH_SHORT).show(); mThis = this; //设置变量的数值 ((Button)findViewById(R.id.btn_click)).setOnClickListener(mOnClickListener); ((Button)findViewById(R.id.btn_show)).setOnClickListener(mOnClickListener); ((Button)findViewById(R.id.btn_call_normal_method)).setOnClickListener(mOnClickListener); ((Button)findViewById(R.id.btn_call_static_method)).setOnClickListener(mOnClickListener); }
- 在jni层,修改jni_study.h,添加两个native函数的申明
JNIEXPORT void JNICALL Java_com_ldj_leanndk001_MainActivity_callNormalMethod (JNIEnv *, jobject); JNIEXPORT jstring JNICALL Java_com_ldj_leanndk001_MainActivity_callStaticMethod (JNIEnv *, jobject);
- 修改jni_study.c文件
//调用普通方法 JNIEXPORT void JNICALL Java_com_ldj_leanndk001_MainActivity_callNormalMethod(JNIEnv * env, jobject obj){ //首先获取class //jclass (*FindClass)(JNIEnv*, const char*); jclass clazz_main = (*env)->FindClass(env,"com/ldj/leanndk001/MainActivity"); //判断clazz_main是否存在 if ( !clazz_main ) { LOGD("clazz_main not existed"); return; } //然后获取需要调用的methidid //jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*); jmethodID normalMethod = (*env)->GetMethodID(env,clazz_main,"normalMethod","()V"); //调用方法 // void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...); (*env)->CallVoidMethod(env,obj,normalMethod); } //调用静态方法 JNIEXPORT jstring JNICALL Java_com_ldj_leanndk001_MainActivity_callStaticMethod(JNIEnv * env, jobject obj){ //首先获取class //jclass (*FindClass)(JNIEnv*, const char*); jclass clazz_main = (*env)->FindClass(env,"com/ldj/leanndk001/MainActivity"); //判断clazz_main是否存在 if ( !clazz_main ) { LOGD("clazz_main not existed"); return (*env)->NewStringUTF(env,"clazz_main not existed"); } //然后获取需要调用的methidid //jmethodID (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*); jmethodID staticMethod = (*env)->GetStaticMethodID(env,clazz_main,"staticMethod","()V"); //调用方法 // void (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...); (*env)->CallStaticVoidMethod(env,clazz_main,staticMethod); jstring result = (*env)->NewStringUTF(env,"callStaticMethod_called"); return result; }
- 然后编译,安装,运行结果如下:
- 本次学习的内容主要是jni层如何调用java层函数,方法还是先类->找方法->调用方法