博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android JNI实现简单的c层调用Java层函数(C层调用Java层Toast进行提示)
阅读量:7136 次
发布时间:2019-06-28

本文共 3611 字,大约阅读时间需要 12 分钟。

终于建了一个自己个人小站:,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~

以前做过一段时间的JNI开发但是总是容易忘记一些简单的jni操作,最近重拾走过的jni开发之路,这里记录下如何在c层调用Java层类及方法,这里的类和方法可以是SDK里面的,也可以是自己编写的。这里分别给出测试工程,工程地址在文章末尾给出。JNI开发的环境配置及简单的JNI介绍百度一下资料很多。

首先编写MyTest.java类

import android.content.Context;import android.widget.Toast;/** * Created by hty on 2016/8/5. */public class MyTest {    static {        System.loadLibrary("mytest");    }    private Context mContext;    public MyTest(Context mContext){        this.mContext = mContext;    }    public void show(String msg){        Toast.makeText(mContext,msg,Toast.LENGTH_SHORT).show();    }    //调用自定义类的方法    public native void callShow(String msg);    //调用SDK里面的方法    public native void callToastShow(Context context,String msg);}
然后利用javah生成对应的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */#include 
#include
/* Header for class com_scu_jnidemo_MyTest */#define TAG "mytest"#define LOGE(...) __android_log_print(__ANDROID_LOG_ERROR,TAG,__VA_ARGS_)/*这里是LOGE日志*/#ifndef _Included_com_scu_jnidemo_MyTest#define _Included_com_scu_jnidemo_MyTest#ifdef __cplusplusextern "C" {#endif/* * Class: com_scu_jnidemo_MyTest * Method: callShow * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callShow (JNIEnv *, jobject, jstring);/* * Class: com_scu_jnidemo_MyTest * Method: callToastShow * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callToastShow (JNIEnv *, jobject,jobject, jstring);#ifdef __cplusplus}#endif#endif
最后编写对应的.cpp文件

//// Created by hty on 2016/8/5.//#include "com_scu_jnidemo_MyTest.h"/* * Class:     com_scu_jnidemo_MyTest * Method:    callShow * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callShow  (JNIEnv *env, jobject thiz, jstring str){    jclass myclass = env->FindClass("com/scu/jnidemo/MyTest");    jmethodID mid = env->GetMethodID(myclass,"show","(Ljava/lang/String;)V");    env->CallVoidMethod(thiz,mid,str);  }/* * Class:     com_scu_jnidemo_MyTest * Method:    callToastShow * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALL Java_com_scu_jnidemo_MyTest_callToastShow  (JNIEnv *env, jobject thiz,jobject context, jstring str){     jclass tclss = env->FindClass("android/widget/Toast");     jmethodID mid = env->GetStaticMethodID(tclss,"makeText","(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;");     jobject job = env->CallStaticObjectMethod(tclss,mid,context,str);     jmethodID showId = env->GetMethodID(tclss,"show","()V");     env->CallVoidMethod(job,showId,context,str);  }
最后在主程序里面进行测试:

package com.scu.jnidemo;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.TextView;public class MainActivity extends Activity implements View.OnClickListener{    private TextView text;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        text = (TextView)findViewById(R.id.text);        findViewById(R.id.button1).setOnClickListener(this);        findViewById(R.id.button2).setOnClickListener(this);    }    @Override    public void onClick(View view) {        MyTest myTest = new MyTest(this);        switch (view.getId()){            case R.id.button1:                myTest.callShow("这个是调用MyTest类里面的show");                break;            case R.id.button2:                myTest.callToastShow(this,"这个是JNI直接调用Toast");                break;        }    }}
在程序里面需要注意的是在local.propreties里面需要将对应的sdk.dir和ndk.dir改成自己的路径

这里给出工程源码地址:

转载地址:http://qjtrl.baihongyu.com/

你可能感兴趣的文章
一张图诠释linux系统启动过程
查看>>
载入jQuery库的最佳方法
查看>>
系统错误提示修复Repair Filesystem
查看>>
【DAY20】Socket编程的补充2
查看>>
Openstack 网络服务Neutron [五]
查看>>
如何看硬盘SMART参数----用HDtune工具查看
查看>>
PUTTY使用Ctrl+s僵死的问题
查看>>
验证码识别技术研究
查看>>
WSDL文件生成java类
查看>>
我的友情链接
查看>>
CentOS7配置本地镜像及安装gluster服务
查看>>
android手势创建及识别
查看>>
弹了个框。。。不过不太好。 待解决
查看>>
keras 保存训练的最佳模型
查看>>
创业找投资,你要警惕的三种人---情商培养
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Z字形扫描(201412-2)
查看>>
linux rpm安装webmin
查看>>
DDOS***原理与防护
查看>>