刚研究了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的对象 - 例子如下:
二、C++调用java//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就会比较复杂了,先来了解一下基本的语法吧!
//-----------------开始写代码-----------------------------------------------------------------------------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