使用java和kotlin作为基础语言时本机c++android项目的不同行为

wh6knrhe  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(159)

我创建了两个本机c项目—一个以kotlin为基础语言,另一个以java为基础语言。
在这两个项目中,我对自动创建的c
函数进行了相同的修改:

extern "C" JNIEXPORT jstring JNICALL
Java_com_stellarsolvers_test_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */,
        jstring s) {

    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

所以我添加了参数: jstring s .
定义也按以下方式修改:
Kotlin:

external fun stringFromJNI(s: String): String

java 语:

public native String stringFromJNI(String s);

在调用代码中,我为此函数提供了一个字符串值:
Kotlin:

sample_text.text = stringFromJNI("Kotlin")

java 语:

tv.setText(stringFromJNI("Java"));

两个项目均未作其他改动。
这两个项目都来自
android studio 3.3版
建造#ai-182.5107.16.33.5199772,建造于2018年12月25日
jre:1.8.0_152-release-1248-b01 x86_64
jvm:openjdk 64位服务器vm by jetbrains s.r.o
macos 10.14.2版
“创建新项目”向导中的单个更改是:
最低api等级:api 21
我希望这两个项目都能正常工作。
java就是这样。
但是,kotlin应用程序的行为方式很奇怪:当执行达到应调用c++函数的点时,程序会在调试器中的sigsegv上崩溃:
虚拟设备:nexus 5x api 28 x86(android 9,api 28)
调试堆栈跟踪是:

art_sigsegv_fault 0x00000000e7e571d0
art::FaultManager::HandleFault(int, siginfo*, void*) 0x00000000e7e57774
art::art_fault_handler(int, siginfo*, void*) (.llvm.650222801) 0x00000000e7e5749b
___lldb_unnamed_symbol22$$app_process32 0x00000000598aa6af
___lldb_unnamed_symbol2$$libc.so 0x00000000eace1c50
art::ManagedStack::ShadowFramesContain(art::StackReference<art::mirror::Object>*) const 0x00000000e8093086
art::Thread::DecodeJObject(_jobject*) const 0x00000000e81d8ac8
<unknown> 0x00000000e876d05d
dlsym 0x00000000598a9530

应用程序在进入本机方法时崩溃。
kotlin应用程序出现这种奇怪行为的原因是什么?
我只是试着在真正的设备上调试:华硕zenfone max pro m1(android 8.1.0,api 27)。kotlin和java项目都能正常工作。调试器允许进入本机方法,不会出现任何崩溃。
因此,更新后的问题状态是:在虚拟设备上,应用程序在100%的情况下崩溃。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题