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代码
    public class TestHello {
    	public native String jnia();
    	static {
    		// 加载libAppConfig.so库文件
    		// AppConfig是添加 Android Native Support时输入的名称
    		// 另外,通过修改Android.mk中的LOCAL_MODULE可以修改这个名称
    		System.loadLibrary("TestNDK");
    	}
    }
    //C++代码
    #include <string h="">
    #include <jni h="">
    #include <android log="" h="">
    #include "TestNDK.h"
    #ifdef __cplusplus  //最好有这个,否则被编译器改了函数名字找不到不要怪我
    extern "C" {
    #endif
    jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj){
    	return 12;
    }
    #ifdef __cplusplus
    }
    #endif
    </android></jni></string>
    二、C++调用java
    C++调用java就会比较复杂了,先来了解一下基本的语法吧!
    JNIEnv* env;
    jclass cls;//对用java的Class
    jobject obj;
    jmethodID mid;//映射方法
    //构建一个Class
    cls = jniEnv->FindClass("com/ndk/testndk/TestHello");//写上类的路径
    //实例化对象
    //方法一
    obj = env->AllocObject(cls);
    //方法二
    jmethodID obj_id = env->GetMethodID(cls,"<init>", "()V");
    TestProvider mTestProvider = env->NewObject(cls,obj_id);
    //映射方法
    //其中"()Ljava/lang/String;",括号是参数,Ljava/lang/String;是返回值,如有参数string,即为"(Ljava/lang/String;)Ljava/lang/String;"
    //静态
    mid = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");
    //非静态
    mid = env->GetMethodID(cls, "getString","()Ljava/lang/String;");
    //调用方法
    //静态:
    env->CallStaticObjectMethod(cls, mid);
    //非静态:
    env->CallVoidMethod(obj, mid,jstr);
    </init>
    //-----------------开始写代码-----------------------------------------------------------------------------
    //java部分
    public class TestHello2 {
    	public static String getStaticString(){
    		return "Java静态的返回值";
    	}
    	
    	public String getString(String str){
    		str += ",还有非静态的。";
    		Log.e("", str);
    		return str;
    	}
    }
    //C++部分
    jstring Java_com_ndk_testndk_TestHello_jnistr(JNIEnv* env,jobject obj){
    	jclass cls = env->FindClass("com/ndk/testndk/TestHello2");
    	jobject obj1 = env->AllocObject(cls);
    	jmethodID mid1 = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");
    	jmethodID mid2 = env->GetMethodID(cls, "getString","(Ljava/lang/String;)Ljava/lang/String;");
    	//静态:
    	jstring jstr = (jstring) env->CallStaticObjectMethod(cls, mid1);
    	//非静态:
    	jstring jstr2 = (jstring) env->CallObjectMethod(obj1, mid2,jstr);
    	return jstr2;
    }
    

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





    以下是一些易犯的错误整理:
    1.在java函数若是String型的,在jni调用是传参必须是env->NewStringUTF("这是字符串")
    Demo下载地址:http://download.csdn.net/detail/super_level/7041419
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值