【发布时间】:2018-05-21 15:41:47
【问题描述】:
我最近实现了 android NDK 来隐藏我的应用密钥和机密。因为每当我在 android studio 中以调试模式运行我的应用程序时都会这样做,所以我的断点会被 sigsegv 中断(信号 sigsegv:无效地址(故障地址:0x8))。当我的任何进程完全访问 NDK 时,就会发生这种情况。我对发生的事情感到困惑,因为我对 NDK 很陌生。我的 C 代码非常简单,看起来像:
#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_my_company_co_utilities_UtilFuncs_getSecretOne(JNIEnv *env, jobject instance) {
return (*env)-> NewStringUTF(env, "my_secret_1");
}
JNIEXPORT jstring JNICALL
Java_com_my_company_co_utilities_UtilFuncs_getSecretTwo(JNIEnv *env, jobject instance) {
return (*env)-> NewStringUTF(env, "my_secret_2");
}
JNIEXPORT jstring JNICALL
JJava_com_my_company_co_utilities_UtilFuncs_getKeyOne(JNIEnv *env, jobject instance) {
return (*env)-> NewStringUTF(env, "my_key_1");
}
JNIEXPORT jstring JNICALL
Java_com_my_company_co_utilities_UtilFuncs_getKeyTwo(JNIEnv *env, jobject instance) {
return (*env)->NewStringUTF(env, "my_key_2");
}
我在我的静态 UtilFuncs 类中访问它,例如:
static {
System.loadLibrary("keys");
}
public static native String getSecretOne();
public static String getSecret() {
return getSecretOne();
}
当我正常运行应用程序时它工作得很好,但是由于这些 sigsegv: invalid address 错误出现在我尝试读取监视变量时,它使调试完全无法使用。有人遇到过这种情况或知道我做错了什么吗?
更新:更新到 Android 9 的手机不会出现该错误,因此我的问题已解决,但我仍然不知道是什么原因造成的。仍然会对有关原始原因的任何理论感兴趣。
【问题讨论】:
-
这可能与你的崩溃没有任何关系,但是你所有的 C 函数签名都是不正确的:因为你已经在你的 Java 代码中声明了它们
static,它们实际上收到了一个@ 987654324@ 作为他们的第二个参数,而不是jobject。 -
谢谢,我更改了它,但不幸的是在调试模式下仍然出现错误。这真的让我很困惑,因为这些方法显然是有效的,但是任何时候在调试中调用它都会抛出它并中断我在调试中看到的任何内容。
-
我以前遇到过这个。我通过使 Android Studio 中的缓存无效并确保所有 Android SDK 工具都是最新的,以某种方式修复了它。我还通过在执行触发断点的操作之前附加调试器来避免它。
-
好建议,但遗憾的是没有解决我的问题?你能想到你还做了什么来修复它吗?
-
您可以使用 ndk-stack 准确找出导致分段错误的变量。
标签: android android-ndk