Android(安卓)JNI C调用Java
16lz
2021-01-24
本文转自http://blog.csdn.net/xyz_lmn/article/details/7017420
源码下载地址:http://download.csdn.net/detail/xyz_lmn/4868265
关键代码:
java:
[java] view plain copy print ?- publicclassCCallJava{
- publicstaticStringgetTime(){
- Log.d("CCallJava","CallFromCJavaStaticMethod"+String.valueOf(System.currentTimeMillis()));
- returnString.valueOf(System.currentTimeMillis());
- }
- publicvoidsayHello(Stringmsg){
- Log.d("CCallJava","CallFromCJavavoidMethod"+String.valueOf(System.currentTimeMillis()));
- }
- }
- #include"TestCCallJava.h"
- #include<android/log.h>
- externJNIEnv*jniEnv;
- jclassTestCCallJava;
- jobjectmTestCCallJava;
- jmethodIDgetTime;
- jmethodIDsayHello;
- intGetTestCCallJavaInstance(jclassobj_class);
- /**
- *初始化类、对象、方法
- */
- intInitTestCCallJava(){
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin1");
- if(jniEnv==NULL){
- return0;
- }
- if(TestCCallJava==NULL){
- TestCCallJava=(*jniEnv)->FindClass(jniEnv,"com/trunkbow/ccalljava/CCallJava");
- if(TestCCallJava==NULL){
- return-1;
- }
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin2ok");
- }
- if(mTestCCallJava==NULL){
- if(GetTestCCallJavaInstance(TestCCallJava)!=1){
- (*jniEnv)->DeleteLocalRef(jniEnv,TestCCallJava);
- return-1;
- }
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin3ok");
- }
- if(getTime==NULL){
- getTime=(*jniEnv)->GetStaticMethodID(jniEnv,TestCCallJava,"getTime","()Ljava/lang/String;");
- if(getTime==NULL){
- (*jniEnv)->DeleteLocalRef(jniEnv,TestCCallJava);
- (*jniEnv)->DeleteLocalRef(jniEnv,mTestCCallJava);
- return-2;
- }
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin4ok");
- }
- if(sayHello==NULL){
- sayHello=(*jniEnv)->GetMethodID(jniEnv,TestCCallJava,"sayHello","(Ljava/lang/String;)V");
- if(sayHello==NULL){
- (*jniEnv)->DeleteLocalRef(jniEnv,TestCCallJava);
- (*jniEnv)->DeleteLocalRef(jniEnv,mTestCCallJava);
- (*jniEnv)->DeleteLocalRef(jniEnv,getTime);
- return-3;
- }
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin5ok");
- }
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin6");
- return1;
- }
- intGetTestCCallJavaInstance(jclassobj_class){
- if(obj_class==NULL){
- return0;
- }
- jmethodIDconstruction_id=(*jniEnv)->GetMethodID(jniEnv,obj_class,
- "<init>","()V");
- if(construction_id==0){
- return-1;
- }
- mTestCCallJava=(*jniEnv)->NewObject(jniEnv,obj_class,
- construction_id);
- if(mTestCCallJava==NULL){
- return-2;
- }
- return1;
- }
- /**
- *获取时间----调用Java方法
- */
- voidGetTime(){
- if(TestCCallJava==NULL||getTime==NULL){
- intresult=InitTestCCallJava();
- if(result!=1){
- return;
- }
- }
- jstringjstr=NULL;
- char*cstr=NULL;
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeBegin");
- jstr=(*jniEnv)->CallStaticObjectMethod(jniEnv,TestCCallJava,getTime);
- cstr=(char*)(*jniEnv)->GetStringUTFChars(jniEnv,jstr,0);
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SuccessGetTimefromJava,Value=%s",cstr);
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeEnd");
- (*jniEnv)->ReleaseStringUTFChars(jniEnv,jstr,cstr);
- (*jniEnv)->DeleteLocalRef(jniEnv,jstr);
- }
- /**
- *SayHello----调用Java方法
- */
- voidSayHello(){
- if(TestCCallJava==NULL||mTestCCallJava==NULL||sayHello==NULL){
- intresult=InitTestCCallJava();
- if(result!=1){
- return;
- }
- }
- jstringjstrMSG=NULL;
- jstrMSG=(*jniEnv)->NewStringUTF(jniEnv,"Hi,I'mFromC");
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloBegin");
- (*jniEnv)->CallVoidMethod(jniEnv,mTestCCallJava,sayHello,jstrMSG);
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloEnd");
- (*jniEnv)->DeleteLocalRef(jniEnv,jstrMSG);
- }
关键代码说明:
C中定义映射的类、方法、对象
[cpp] view plain copy print ?
- jclassTestCCallJava;
- jobjectmTestCCallJava;
- jmethodIDgetTime;
- jmethodIDsayHello;
InitTestCCallJava()方法初始化类、方法、对象
初始化类: [html] view plain copy print ?
- TestCCallJava=(*jniEnv)->FindClass(jniEnv,"com/trunkbow/ccalljava/CCallJava");
初始化对象: [html] view plain copy print ?
- mTestCCallJava=(*jniEnv)->NewObject(jniEnv,obj_class,construction_id);
初始化方法: 静态方法: [html] view plain copy print ?
- getTime=(*jniEnv)->GetStaticMethodID(jniEnv,TestCCallJava,"getTime","()Ljava/lang/String;");
[html] view plain copy print ?
- sayHello=(*jniEnv)->GetMethodID(jniEnv,TestCCallJava,"sayHello","(Ljava/lang/String;)V");
C中调用Java的方法
调用静态方法: [html] view plain copy print ?
- jstringjstr=NULL;
- char*cstr=NULL;
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeBegin");
- jstr=(*jniEnv)->CallStaticObjectMethod(jniEnv,TestCCallJava,getTime);
- cstr=(char*)(*jniEnv)->GetStringUTFChars(jniEnv,jstr,0);
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SuccessGetTimefromJava,Value=%s",cstr);
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeEnd");
调用非静态方法
[html] view plain copy print ?
- jstringjstrMSG=NULL;
- jstrMSG=(*jniEnv)->NewStringUTF(jniEnv,"Hi,I'mFromC");
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloBegin");
- (*jniEnv)->CallVoidMethod(jniEnv,mTestCCallJava,sayHello,jstrMSG);
- __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloEnd");
注意GetXXXMethodID和CallXXXMethod。
第一个XXX表示的是映射方法的类型,如:静态跟非静态
第二个XXX表示调用方法的返回值,如:Void,Object,等等。(调用静态方法的时候Call后面要加Static)
详细映射方法和调用方法请参考JNI文档,这个很重要!
工程的其他代码可在http://download.csdn.net/detail/xyz_lmn/4868265下载
更多相关文章
- android 手机铃声获取
- android mediaPlayer error (-38,0) 解决方法
- 【Android】Web开发之显示网络图片的两种方法
- android java.util.Date和java.util.sql中Date的区别
- Binder驱动之打开设备----binder_open
- Android返回数据给上一个活动-startActivityForResult
- android onContextItemSelected和onMenuItemSelected厉害关系
- 【Android(安卓)应用开发】 自定义 圆形进度条 组件
- 在Android(安卓)Studio中使用androidannotations(安卓注解)的方法(