【问题标题】:art_sigsegv_fault when entering JNI function in C code within android studio在android studio中的C代码中输入JNI函数时出现art_sigsegv_fault
【发布时间】: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


【解决方案1】:

答案在:Different behavior of Native C++ Android projects when using Java and Kotlin as a base language

这似乎是关于 API 模拟器和正在使用的版本的错误。如果版本降级到 API 25,则没有问题。同样,如果应用程序是在设备而不是模拟器上构建的,将有助于解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2012-03-15
    相关资源
    最近更新 更多