剛研究了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++調用javaJNIEnv* 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;
}
下載地址:http://download.csdn.net/detail/super_level/7041419