本篇将介绍在JNI编程中C调用Java实现。

源码下载地址:http://download.csdn.net/detail/xyz_lmn/4868265

关键代码:

java:

        
  1. publicclassCCallJava{
  2. publicstaticStringgetTime(){
  3. Log.d("CCallJava","CallFromCJavaStaticMethod"+String.valueOf(System.currentTimeMillis()));
  4. returnString.valueOf(System.currentTimeMillis());
  5. }
  6. publicvoidsayHello(Stringmsg){
  7. Log.d("CCallJava","CallFromCJavavoidMethod"+String.valueOf(System.currentTimeMillis()));
  8. }
  9. }

C:

            
  1. #include"TestCCallJava.h"
  2. #include<android/log.h>
  3. externJNIEnv*jniEnv;
  4. jclassTestCCallJava;
  5. jobjectmTestCCallJava;
  6. jmethodIDgetTime;
  7. jmethodIDsayHello;
  8. intGetTestCCallJavaInstance(jclassobj_class);
  9. /**
  10. *初始化类、对象、方法
  11. */
  12. intInitTestCCallJava(){
  13. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin1");
  14. if(jniEnv==NULL){
  15. return0;
  16. }
  17. if(TestCCallJava==NULL){
  18. TestCCallJava=(*jniEnv)->FindClass(jniEnv,"com/trunkbow/ccalljava/CCallJava");
  19. if(TestCCallJava==NULL){
  20. return-1;
  21. }
  22. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin2ok");
  23. }
  24. if(mTestCCallJava==NULL){
  25. if(GetTestCCallJavaInstance(TestCCallJava)!=1){
  26. (*jniEnv)->DeleteLocalRef(jniEnv,TestCCallJava);
  27. return-1;
  28. }
  29. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin3ok");
  30. }
  31. if(getTime==NULL){
  32. getTime=(*jniEnv)->GetStaticMethodID(jniEnv,TestCCallJava,"getTime","()Ljava/lang/String;");
  33. if(getTime==NULL){
  34. (*jniEnv)->DeleteLocalRef(jniEnv,TestCCallJava);
  35. (*jniEnv)->DeleteLocalRef(jniEnv,mTestCCallJava);
  36. return-2;
  37. }
  38. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin4ok");
  39. }
  40. if(sayHello==NULL){
  41. sayHello=(*jniEnv)->GetMethodID(jniEnv,TestCCallJava,"sayHello","(Ljava/lang/String;)V");
  42. if(sayHello==NULL){
  43. (*jniEnv)->DeleteLocalRef(jniEnv,TestCCallJava);
  44. (*jniEnv)->DeleteLocalRef(jniEnv,mTestCCallJava);
  45. (*jniEnv)->DeleteLocalRef(jniEnv,getTime);
  46. return-3;
  47. }
  48. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin5ok");
  49. }
  50. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","InitTestCCallJavaBegin6");
  51. return1;
  52. }
  53. intGetTestCCallJavaInstance(jclassobj_class){
  54. if(obj_class==NULL){
  55. return0;
  56. }
  57. jmethodIDconstruction_id=(*jniEnv)->GetMethodID(jniEnv,obj_class,
  58. "<init>","()V");
  59. if(construction_id==0){
  60. return-1;
  61. }
  62. mTestCCallJava=(*jniEnv)->NewObject(jniEnv,obj_class,
  63. construction_id);
  64. if(mTestCCallJava==NULL){
  65. return-2;
  66. }
  67. return1;
  68. }
  69. /**
  70. *获取时间----调用Java方法
  71. */
  72. voidGetTime(){
  73. if(TestCCallJava==NULL||getTime==NULL){
  74. intresult=InitTestCCallJava();
  75. if(result!=1){
  76. return;
  77. }
  78. }
  79. jstringjstr=NULL;
  80. char*cstr=NULL;
  81. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeBegin");
  82. jstr=(*jniEnv)->CallStaticObjectMethod(jniEnv,TestCCallJava,getTime);
  83. cstr=(char*)(*jniEnv)->GetStringUTFChars(jniEnv,jstr,0);
  84. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SuccessGetTimefromJava,Value=%s",cstr);
  85. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeEnd");
  86. (*jniEnv)->ReleaseStringUTFChars(jniEnv,jstr,cstr);
  87. (*jniEnv)->DeleteLocalRef(jniEnv,jstr);
  88. }
  89. /**
  90. *SayHello----调用Java方法
  91. */
  92. voidSayHello(){
  93. if(TestCCallJava==NULL||mTestCCallJava==NULL||sayHello==NULL){
  94. intresult=InitTestCCallJava();
  95. if(result!=1){
  96. return;
  97. }
  98. }
  99. jstringjstrMSG=NULL;
  100. jstrMSG=(*jniEnv)->NewStringUTF(jniEnv,"Hi,I'mFromC");
  101. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloBegin");
  102. (*jniEnv)->CallVoidMethod(jniEnv,mTestCCallJava,sayHello,jstrMSG);
  103. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloEnd");
  104. (*jniEnv)->DeleteLocalRef(jniEnv,jstrMSG);
  105. }

关键代码说明:

C中定义映射的类、方法、对象

            
  1. jclassTestCCallJava;
  2. jobjectmTestCCallJava;
  3. jmethodIDgetTime;
  4. jmethodIDsayHello;


InitTestCCallJava()方法初始化类、方法、对象

初始化类: [html] view plain copy
  1. TestCCallJava=(*jniEnv)->FindClass(jniEnv,"com/trunkbow/ccalljava/CCallJava");

初始化对象: [html] view plain copy
  1. mTestCCallJava=(*jniEnv)->NewObject(jniEnv,obj_class,construction_id);

初始化方法: 静态方法: [html] view plain copy
  1. getTime=(*jniEnv)->GetStaticMethodID(jniEnv,TestCCallJava,"getTime","()Ljava/lang/String;");
非静态方法:
[html] view plain copy
  1. sayHello=(*jniEnv)->GetMethodID(jniEnv,TestCCallJava,"sayHello","(Ljava/lang/String;)V");

C中调用Java方法

调用静态方法: [html] view plain copy
  1. jstringjstr=NULL;
  2. char*cstr=NULL;
  3. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeBegin");
  4. jstr=(*jniEnv)->CallStaticObjectMethod(jniEnv,TestCCallJava,getTime);
  5. cstr=(char*)(*jniEnv)->GetStringUTFChars(jniEnv,jstr,0);
  6. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SuccessGetTimefromJava,Value=%s",cstr);
  7. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","GetTimeEnd");

调用非静态方法
[html] view plain copy
  1. jstringjstrMSG=NULL;
  2. jstrMSG=(*jniEnv)->NewStringUTF(jniEnv,"Hi,I'mFromC");
  3. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloBegin");
  4. (*jniEnv)->CallVoidMethod(jniEnv,mTestCCallJava,sayHello,jstrMSG);
  5. __android_log_print(ANDROID_LOG_INFO,"JNIMsg","SayHelloEnd");

注意GetXXXMethodIDCallXXXMethod

第一个XXX表示的是映射方法的类型,如:静态跟非静态

第二个XXX表示调用方法的返回值,如:Void,Object,等等。(调用静态方法的时候Call后面要加Static)

详细映射方法和调用方法请参考JNI文档,这个很重要!


工程的其他代码可在http://download.csdn.net/detail/xyz_lmn/4868265下载
/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/

更多相关文章

  1. android fragment show hide回调
  2. Android(安卓)lifecycle 实战及使用进阶
  3. android scrollview的所有touchevent的顺序
  4. 转发:bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化
  5. 「Android」SurfaceFlinger分析
  6. Android(安卓)UI 学习 自定义的布局 平滑移动 VelocityTracker()
  7. Android开发:关于Android冷启动优化(从3.63%降到0.95%)
  8. Android____View-->Bitmap
  9. android注入代码之注入类方法

随机推荐

  1. android 学习视频
  2. 重磅首发!Android(安卓)Jetpack Compose
  3. opencv for android(十六):opencv在androi
  4. HttpUrlConnect 响应为空的问题分析
  5. Android(安卓)原生WebView的使用
  6. Android(安卓)Studio的安装,史上最详细(超
  7. Android高级工程师每日一面试题精选!(1——
  8. Android(安卓)编译错误::app:transformCl
  9. 一点见解: Android事件分发机制(一)
  10. android cts测试失败项以及原因