我正在嘗試訪問 jni 中的 getPackageManager.getApplicationInfo。
const char* getNativeLibPath(JNIEnv* env, jobject thiz, const char* libraryName, const char* packageName) {
jclass contextClass = env->GetObjectClass(thiz);
jmethodID getPackageManager = env->GetMethodID(contextClass, "getPackageManager", "()Landroid/content/pm/PackageManager;");
jobject instantiatePackageManager = env->CallObjectMethod(thiz, getPackageManager);
jclass packageManagerClass = env->GetObjectClass(instantiatePackageManager);
jmethodID getApplicationInfo = env->GetMethodID(packageManagerClass, "getApplicationInfo", "(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;");
jobject instantiateApplicationInfo = env->CallObjectMethod(thiz, getApplicationInfo, packageName, 0);
jclass applicationInfoClass = env->GetObjectClass(instantiateApplicationInfo);
jfieldID nativeLibraryDir = env->GetFieldID(applicationInfoClass, "nativeLibraryDir", "Ljava/lang/String;");
auto string = (jstring) env->GetObjectField(instantiateApplicationInfo, nativeLibraryDir);
const char* returnValue = env->GetStringUTFChars(string, nullptr);
std::string appendedResult = std::string(returnValue) std::string("/") std::string(libraryName);
return appendedResult.c_str();
}
這是我的代碼。但是由于某種原因,我收到此錯誤:JNI ERROR (app bug): accessed stale WeakGlobal 0x74eecd21ff (index 1324143135 in a table of size 38) JNI DETECTED ERROR IN APPLICATION: use of deleted weak global reference 0x74eecd21ff
感謝任何幫助!
uj5u.com熱心網友回復:
你的代碼至少有三個問題:
- 您
getApplicationInfo使用const char *需要 Java 字串的 a呼叫:
jobject instantiateApplicationInfo = env->CallObjectMethod(instantiatePackageManager, getApplicationInfo, env->NewStringUTF(packageName), 0);
需要
env->ReleaseStringUTF(returnValue)在Java端呼叫釋放字串你不能
const char *像這樣回傳一個。要么std::string直接回傳,要么分配記憶體new char[]并讓呼叫者釋放它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/331747.html
標籤:安卓 C java-native-接口
