我创建了两个本机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%的情况下崩溃。
暂无答案!
目前还没有任何答案,快来回答吧!