gpt4 book ai didi

java - 使用 Android NDK 获取 ANDROID_ID - 过时的本地引用错误

转载 作者:太空狗 更新时间:2023-10-29 14:05:59 26 4
gpt4 key购买 nike

我正在开发一个应用程序,其中一个要求是我通过 NDK 收集设备的 ANDROID_ID

在查看了无数的线程、答案和引用资料之后,我想出了一个初始实现,它在我用来执行 Java 和 native 层之间的所有交互的类上调用一个静态方法。唯一的问题是它在检索 ANDROID_ID 时在底部抛出以下错误,然后就退出了。

JNI ERROR (app bug): accessed stale local reference 0x5d6892a9 (index 9386 in a table of size 11)

我知道错误发生在最后一个函数调用 (CallStaticObjectMethod) 上,因为我已经尝试向它添加日志并且它会执行其他所有操作。这是我目前使用的代码:

SampleActivity.java

class SampleActivity {

// ...

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

NativeService.initialize(this);

// ...
}
}

NativeService.java

public class NativeService {

// ...

public native static boolean initialize(Context ctx);
}

Native.cpp

JNIEXPORT jboolean JNICALL Java_com_company_mobile_NativeService_initialize(JNIEnv * env, jobject obj,
jobject ctx
) {
jclass contextClass = env->GetObjectClass(ctx);
if (contextClass == NULL) {
return false;
}

jmethodID getContentResolverMID = env->GetMethodID(contextClass, "getContentResolver", "()Landroid/content/ContentResolver;");
if (getContentResolverMID == NULL) {
return false;
}

jobject contentResolverObj = env->CallObjectMethod(ctx, getContentResolverMID);
if (contentResolverObj == NULL) {
return false;
}

jclass settingsSecureClass = env->FindClass("android/provider/Settings$Secure");
if (settingsSecureClass == NULL) {
return false;
}

jmethodID getStringMID = env->GetStaticMethodID(settingsSecureClass, "getString", "(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;");
if (getStringMID == NULL) {
return false;
}

// Offending line
jstring androidId = (jstring) env->CallStaticObjectMethod(settingsSecureClass, getStringMID, contentResolverObj, "android_id");
if (androidId == NULL) {
return false;
}

return (strcmp((char *)androidId, "0123456789ABCDEF") == 0);
}

最佳答案

getString 的第二个参数应该是 java/lang/String 的实例。文字 "android_id" 是一个 char 数组,它会退化为 (const) char*

要从 const char* 字符串构造一个 java/lang/String 实例,您应该使用 JNI 函数 NewStringUTF:

jstring idStr = (jstring) env->NewStringUTF("android_id");
// Do relevant error checking, and then:
jstring androidId = (jstring) env->CallStaticObjectMethod(settingsSecureClass, getStringMID, contentResolverObj, idStr);

关于java - 使用 Android NDK 获取 ANDROID_ID - 过时的本地引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32337854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com