C层调用Toast弹出--JNI编程实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wmh_100200/article/details/79965523

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调用。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页