android-java与C++的相互调用-随心



刚研究了java与C++的相互调用,赶紧记录下来。。。
一、java调用C++

  • 要想让java调用C++,必须让C++函数按着命名规则来。命名规则为
    返回值 Java_包路径_类名_函数名(JNIEnv* env,jobject obj);对应如下:
    jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj);
    其中第二个参数为该类的对象,也就是TestHello的对象
  • 例子如下:
    [java]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. //java代码  
    2. public class TestHello {  
    3.     public native String jnia();  
    4.     static {  
    5.         // 加载libAppConfig.so库文件  
    6.         // AppConfig是添加 Android Native Support时输入的名称  
    7.         // 另外,通过修改Android.mk中的LOCAL_MODULE可以修改这个名称  
    8.         System.loadLibrary("TestNDK");  
    9.     }  
    10. }  
    11. //C++代码  
    12. #include <string h="">  
    13. #include <jni h="">  
    14. #include <android log="" h="">  
    15. #include "TestNDK.h"  
    16. #ifdef __cplusplus  //最好有这个,否则被编译器改了函数名字找不到不要怪我  
    17. extern "C" {  
    18. #endif  
    19. jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj){  
    20.     return 12;  
    21. }  
    22. #ifdef __cplusplus  
    23. }  
    24. #endif  
    25. </android></jni></string>  
    二、C++调用java
    C++调用java就会比较复杂了,先来了解一下基本的语法吧!
    [java]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. JNIEnv* env;  
    2. jclass cls;//对用java的Class  
    3. jobject obj;  
    4. jmethodID mid;//映射方法  
    5. //构建一个Class  
    6. cls = jniEnv->FindClass("com/ndk/testndk/TestHello");//写上类的路径  
    7. //实例化对象  
    8. //方法一  
    9. obj = env->AllocObject(cls);  
    10. //方法二  
    11. jmethodID obj_id = env->GetMethodID(cls,"<init>""()V");  
    12. TestProvider mTestProvider = env->NewObject(cls,obj_id);  
    13. //映射方法  
    14. //其中"()Ljava/lang/String;",括号是参数,Ljava/lang/String;是返回值,如有参数string,即为"(Ljava/lang/String;)Ljava/lang/String;"  
    15. //静态  
    16. mid = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");  
    17. //非静态  
    18. mid = env->GetMethodID(cls, "getString","()Ljava/lang/String;");  
    19. //调用方法  
    20. //静态:  
    21. env->CallStaticObjectMethod(cls, mid);  
    22. //非静态:  
    23. env->CallVoidMethod(obj, mid,jstr);  
    24. </init>  
    //-----------------开始写代码-----------------------------------------------------------------------------
    [java]  view plain  copy
      在CODE上查看代码片 派生到我的代码片
    1. //java部分  
    2. public class TestHello2 {  
    3.     public static String getStaticString(){  
    4.         return "Java静态的返回值";  
    5.     }  
    6.       
    7.     public String getString(String str){  
    8.         str += ",还有非静态的。";  
    9.         Log.e("", str);  
    10.         return str;  
    11.     }  
    12. }  
    13. //C++部分  
    14. jstring Java_com_ndk_testndk_TestHello_jnistr(JNIEnv* env,jobject obj){  
    15.     jclass cls = env->FindClass("com/ndk/testndk/TestHello2");  
    16.     jobject obj1 = env->AllocObject(cls);  
    17.     jmethodID mid1 = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");  
    18.     jmethodID mid2 = env->GetMethodID(cls, "getString","(Ljava/lang/String;)Ljava/lang/String;");  
    19.     //静态:  
    20.     jstring jstr = (jstring) env->CallStaticObjectMethod(cls, mid1);  
    21.     //非静态:  
    22.     jstring jstr2 = (jstring) env->CallObjectMethod(obj1, mid2,jstr);  
    23.     return jstr2;  
    24. }  

    getStaticMethodInfo和getMethodInfo的最后一个参数如下图





    以下是一些易犯的错误整理:
    1.在java函数若是String型的,在jni调用是传参必须是env->NewStringUTF("这是字符串")
    Demo下载地址:http://download.csdn.net/detail/super_level/7041419

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值