剛研究了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二、C++調用java#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
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; }