【发布时间】:2022-01-26 02:15:59
【问题描述】:
我正在使用 Kotlin 和 JNI,因为我希望将 C 程序移植到 Android,我想知道为什么我目前在 JNI 函数的断点被命中时会收到“art_sigsegv_fault”。
Kotlin 代码:
import com.root.Main
class SettingsScreenActivity : AppCompatActivity() {
private val MainC = Main()
fun startButton(view: View)
MainC.callMainFromJNI("test")
}
}
MainC.c
JNIEXPORT void JNICALL Java_com_root_hping2_Main_callMainFromJNI(JNIEnv *env, jobject pThis, jstring argument){
printf("Size of char: %ld byte\n",sizeof(char));
return;
}
断点在 printf 上,但是,当我去调试时,我收到“art_sigsegv_fault”错误,我看不到任何参数值。这是在 Android Studio 中
编辑: 当我删除 jstring 参数并且不将字符串传递给函数时,它可以正常工作。这是什么原因?
【问题讨论】:
-
无法重现(使用模拟器)。请提供一个最小、完整且可验证的示例。
-
我遇到了同样的问题,只是它来自 Java,而不是 Kotlin,而且 JNI 文件是纯 C,而不是 C++。如果我从所有内容中取出 jstring 参数,它就可以工作,并且调试器允许我单步执行 JNI 代码,并成功返回。但是,如果我重新添加 jstring 参数,并调整类声明以提供一个字符串作为参数,我会遇到同样的崩溃,并报告“art_sigsegv_fault”。该函数采用较早的 jint 参数,这在没有第二个 jstring 参数的情况下起作用。似乎与添加的 jstring 参数明显相关,尽管它可能不是。
标签: android-studio kotlin java-native-interface