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 
#include 
#include 
#include "TestNDK.h"
#ifdef __cplusplus  //最好有这个,否则被编译器改了函数名字找不到不要怪我
extern "C" {
#endif
jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj){
	return 12;
}
#ifdef __cplusplus
}
#endif
二、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,"", "()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);
//-----------------开始写代码-----------------------------------------------------------------------------
//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的最后一个参数如下图


android-java与C++的相互调用-随心_第1张图片


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

你可能感兴趣的:(Android-JNI)