android-java與C++的相互呼叫-隨心
阿新 • • 發佈:2019-01-09
剛研究了java與C++的相互呼叫,趕緊記錄下來。。。
一、java呼叫C++
返回值 Java_包路徑_類名_函式名(JNIEnv* env,jobject obj);對應如下:
jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj);
其中第二個引數為該類的物件,也就是TestHello的物件例子如下:
- //java程式碼
- publicclass TestHello {
- publicnative 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){
- return12;
- }
- #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部分
- publicclass TestHello2 {
- publicstatic 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