Android(安卓)JNI入门第六篇――C调用Java
16lz
2021-01-24
本篇将介绍在JNI编程中C调用Java实现。
源码下载地址:http://download.csdn.net/detail/xyz_lmn/4868265
关键代码:
java:
- publicclassCCallJava{
- publicstaticStringgetTime(){
- Log.d("CCallJava","CallFromCJavaStaticMethod"+String.valueOf(System.currentTimeMillis()));
- returnString.valueOf(System.currentTimeMillis());
- }
- publicvoidsayHello(Stringmsg){
- Log.d("CCallJava","CallFromCJavavoidMethod"+String.valueOf(System.currentTimeMillis()));
- }
- }
C:
- #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中定义映射的类、方法、对象
- jclassTestCCallJava;
- jobjectmTestCCallJava;
- jmethodIDgetTime;
- jmethodIDsayHello;
InitTestCCallJava()方法初始化类、方法、对象
- TestCCallJava=(*jniEnv)->FindClass(jniEnv,"com/trunkbow/ccalljava/CCallJava");
初始化对象: [html] view plain copy
- mTestCCallJava=(*jniEnv)->NewObject(jniEnv,obj_class,construction_id);
初始化方法: 静态方法: [html] view plain copy
- getTime=(*jniEnv)->GetStaticMethodID(jniEnv,TestCCallJava,"getTime","()Ljava/lang/String;");
[html] view plain copy
- sayHello=(*jniEnv)->GetMethodID(jniEnv,TestCCallJava,"sayHello","(Ljava/lang/String;)V");
C中调用Java的方法
调用静态方法: [html] view plain copy
- 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
- 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下载
/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/
更多相关文章
- android fragment show hide回调
- Android(安卓)lifecycle 实战及使用进阶
- android scrollview的所有touchevent的顺序
- 转发:bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化
- 「Android」SurfaceFlinger分析
- Android(安卓)UI 学习 自定义的布局 平滑移动 VelocityTracker()
- Android开发:关于Android冷启动优化(从3.63%降到0.95%)
- Android____View-->Bitmap
- android注入代码之注入类方法