C层调用Toast弹出–JNI编程实战
在Android开发中,我们知道使用Java语音可以写出Toast弹出字符串效果。那么使用C语音能否实现同样的功能呢?
在一些Android的开发中,为了提高安全性等原因,有些代码我们不得不使用C/C++语言使用JNI实现其功能,面对Java中的特性,我们如何调用?本文主要介绍如何在C层反射调用Java层的函数,实现Toast弹出。
一. Java层封装
首先为了能从C层反射调用Java层方法,需要在Java层封装好Toast方法,代码如下,注意包名、类名和方法名,其名字可以任意,但是在C层反射调用的时候需要根据自己写的包名、类名和方法名进行修改。(我这里是写在application中,当然也可以写在自己想要的activity中,但是需要注意C层调用时该类有没有进行加载)
package com.test;
import android.content.Context;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;
public class FirstApplication extends Application{
protected void attachBaseContext(Context arg1) {
super.attachBaseContext(arg1);
}
//这个方法是封装好的用于C层反射调用的方法
public void showToast(String msg){
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
}
二. C层反射调用
Java层写好就需要我们C层反射调用了,至于JNI怎么写,不用多说,网上都有,这里只贴一下C层的函数代码。
void ToastFromJni(JNIEnv *env, jobject object){
jstring toast_msg = (jstring)(*env)->NewStringUTF(env,"This mesage is from C");
jclass myclass = (*env)->FindClass(env,"com/test/FirstApplication");
jmethodID mid = (*env)->GetMethodID(env,myclass,"showToast","(Ljava/lang/String;)V");
(*env)->CallVoidMethod(env,object,mid,toast_msg);
}
OK,几行代码很轻松搞定Toast调用。