本文转自http://blog.csdn.net/xyz_lmn/article/details/7017420

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


关键代码:

java:

[java] view plain copy print ?
  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: [cpp] view plain copy print ?
  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中定义映射的类、方法、对象
[cpp] view plain copy print ?
  1. jclassTestCCallJava;
  2. jobjectmTestCCallJava;
  3. jmethodIDgetTime;
  4. jmethodIDsayHello;

InitTestCCallJava()方法初始化类、方法、对象
初始化类: [html] view plain copy print ?
  1. TestCCallJava=(*jniEnv)->FindClass(jniEnv,"com/trunkbow/ccalljava/CCallJava");

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

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

C中调用Java方法

调用静态方法: [html] view plain copy print ?
  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 print ?
  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下载

更多相关文章

  1. android 手机铃声获取
  2. android mediaPlayer error (-38,0) 解决方法
  3. 【Android】Web开发之显示网络图片的两种方法
  4. android java.util.Date和java.util.sql中Date的区别
  5. Binder驱动之打开设备----binder_open
  6. Android返回数据给上一个活动-startActivityForResult
  7. android onContextItemSelected和onMenuItemSelected厉害关系
  8. 【Android(安卓)应用开发】 自定义 圆形进度条 组件
  9. 在Android(安卓)Studio中使用androidannotations(安卓注解)的方法(

随机推荐

  1. Android(安卓)多进程之Messenger的使用
  2. Android系统自带样式(@android:style/)
  3. 浅析Android手机卫士手机定位的原理
  4. Android音频开发(4):PCM转WAV格式音频
  5. Android(安卓)App更改背景颜色
  6. 【Android】Android(安卓)4.0 无法接收开
  7. 分享10个Android游戏源码,要的赶紧来哈
  8. Android(安卓)Trick 8: ProgressBar的圆
  9. android 布局
  10. android 设置 TextView