JNI呼叫之C++與Android
阿新 • • 發佈:2018-12-30
最近專案中經常用到Jni呼叫,在此我做一些總結,沒有總結到的,下次再進行記錄!
1. C++ 呼叫java方法,不傳參無返回值的時候,可以進行直接呼叫,例子如下:
ZFY::JniMethodInfo methodInfo; if (ZFY::JniHelper::getStaticMethodInfo(methodInfo, "com/test/zfy/AndroidSystemInfo", "openURL", "()V")) { jstring stringArg1 = methodInfo.env->NewStringUTF(urlstring.c_str()); methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID); methodInfo.env->DeleteLocalRef(methodInfo.classID); }
2. C++ 呼叫java方法,傳參無返回值的時候,可以進行直接呼叫,例子如下:
KXCR::JniMethodInfo methodInfo; if (ZFY::JniHelper::getStaticMethodInfo(methodInfo, "com/test/zfy/Android", "openURL", "(Ljava/lang/String;)V")) { jstring stringArg1 = methodInfo.env->NewStringUTF(urlstring.c_str()); methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg1); methodInfo.env->DeleteLocalRef(methodInfo.classID); }
上面的就需要注意傳入的引數了,C++的引數 :std::string& urlstring = "測試資料";然後就是要傳入java方法的時候,用jstring承接一下然後再傳入呼叫CallStaticVoidMethod方法。
3. C++ 呼叫java方法,傳參有返回值的時候,可以進行直接呼叫,例子如下:
std::string strPath = aPath; ZFY::JniMethodInfo methodInfo; if (ZFY::JniHelper::getStaticMethodInfo(methodInfo, "com/zfy/test/GameSDK", "getApkAssetsDir", "(Ljava/lang/String;)Ljava/lang/String;")) { jobject stringArg1 = methodInfo.env->NewStringUTF(strPath.c_str());//注意這個型別 jstring fullPath = (jstring)methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID, stringArg1);//注意這個呼叫方法 std::string fullPathStr = std::string(ZFY::JniHelper::jstring2string(fullPath).c_str()); //C++ 拿到java方法返回值 methodInfo.env->DeleteLocalRef(methodInfo.classID); strFullPath = fullPathStr.c_str(); }
上邊的程式碼需要注意的就多了,首先呼叫方法不一樣了,CallStaticObjectMethod 它跟上邊方法是不同的;其次就是傳入的引數不是變量了,而是型別---> jobject ;並且用 std::string fullPathStr = std::string(ZFY::JniHelper::jstring2string(fullPath).c_str()); 承接java返回的資料。
好了,其他的我就不多做介紹了,因為這三類就夠用了,它們都是類似的這樣方法,只是傳入的引數不同而已,並且網上有那麼多的資料來告訴你,C++ 、 java 、 jni 三者之間的型別轉換或者傳遞,所以這上邊的三個方法足夠用了。我上邊的只是一些模板而已,其他的東西靠你們自己去往裡面去套用就哦了!!!
到此結束,以後遇見新問題,新經驗,還會記錄,不定時更新!!!