[英]Fatal signal 11 (SIGSEGV), after second JNI String call to Java method
我有點被這個問題迷住了:我想將一個字符串參數從我通過 ROS 調用的 C++ 方法(本機 C)傳遞給 Java 方法。 在這個java方法中,我正在編程的機器人應該使用一些Text-to-Speak內部方法來說寫的東西(tts方法是機器人公司提供的)。 但是每當我從 ROS 在 C++ 中調用此方法時,第一次調用都得到了正確處理,但在第二次調用時程序崩潰並出現了前面所述的錯誤代碼。 這是我的 C++ 代碼:(myEnv/myVM/myClass 之前在 init 方法中設置)(log 只是一個小的自己的方法,它為 C++ 執行 System.out.println())
void onSpeech(const std_msgs::String::ConstPtr &msg){
log("RECEIVED SPEECH");
log(msg->data.c_str());
myVM->AttachCurrentThread(&myEnv, nullptr);
jstring stringMsg = myEnv->NewStringUTF(msg->data.c_str());
log("CALL JAVA METHOD");
jmethodID mid = myEnv->GetStaticMethodID(myClass, "setSpeech", "(Ljava/lang/String;)V");
myEnv->CallStaticVoidMethod(myClass, mid, stringMsg);
log("START WAITING");
ros::Time begin = ros::Time().now();
while(begin + ros::Duration(2,0) > ros::Time().now()){ }
log("WAIT FINISHED");
log("CALL RELEASE");
myEnv->ReleaseStringUTFChars(stringMsg, msg->data.c_str());
myVM->DetachCurrentThread();
}
這是我們調用的 Java 方法。 我經常復制傳遞的String,因為我想復制的是word的數據而不是指針,C++代碼可以釋放stringMsg變量而不影響java代碼。
public static void setSpeech(String text) {
System.out.println("JAVA CALL");
System.out.println("PASSED TEXT: " + text);
char[] newChar = text.toCharArray();
System.out.println("CHAR: " + Arrays.toString(newChar));
String newString = String.copyValueOf(newChar);
System.out.println("NEW STRING: " + newString);
//Below is just the ttsmethod like this: startSpeak(newString)
}
這是完整的日志,我首先發送了一條消息,其中包含數據“Hello 1”,它按預期工作,機器人說它是正確的。 但在那之后我發送了另一條消息,其中包含數據“Hello 2”,程序在設置 newChar 之前崩潰了。 這在我看來是沒有意義的,因為我們甚至在 System.out.println() 前一行的文本。
I/CPP: Hello 1
I/CPP: CALL JAVA METHOD
I/System.out: JAVA CALL
I/System.out: PASSED TEXT: Hello 1
I/System.out: CHAR: [H, e, l, l, o, , 1]
I/System.out: NEW STRING: Hello 1
I/CPP: START WAITING
I/System.out: SPEECH STARTED: Hello 1
I/System.out: SPEECH FINISHED
I/CPP: WAIT FINISHED
I/CPP: CALL RELEASE
//Now I call the method again
I/CPP: RECEIVED SPEECH
I/CPP: Hello 2
I/CPP: CALL JAVA METHOD
I/System.out: JAVA CALL
I/System.out: PASSED TEXT: Hello 2
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x38206f in tid 8890 (Thread-117)
任何幫助將不勝感激,我真的不知道為什么代碼在“PASSED TEXT”行中工作,然后在 newChar 行中突然崩潰。 謝謝
順便說一句,這是“Hello 9”和“Hello 9”的 logcat 輸出
2022-12-19 13:44:28.785 9455-9499/rob.rosloomo I/ROSCPP_NDK: RECEIVED SPEECH
2022-12-19 13:44:28.786 9455-9499/rob.rosloomo I/ROSCPP_NDK: Hello 9
2022-12-19 13:44:28.787 9455-9499/rob.rosloomo I/ROSCPP_NDK: CALL JAVA METHOD
2022-12-19 13:44:28.788 9455-9499/rob.rosloomo I/System.out: JAVA CALL
2022-12-19 13:44:28.788 9455-9499/rob.rosloomo I/System.out: PASSED TEXT: Hello 9
2022-12-19 13:44:28.788 9455-9499/rob.rosloomo A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x39206f in tid 9499 (Thread-130)
2022-12-19 13:44:28.893 2750-2750/? I/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2022-12-19 13:44:28.893 2750-2750/? I/DEBUG: Build fingerprint: 'i-Buddie/VA50EC_i_Buddie/VA50EC_1:5.1.1/LMY47Z/78:user/test-keys'
2022-12-19 13:44:28.893 2750-2750/? I/DEBUG: Revision: '0'
2022-12-19 13:44:28.893 2750-2750/? I/DEBUG: ABI: 'x86'
2022-12-19 13:44:28.894 2750-2750/? I/DEBUG: pid: 9455, tid: 9499, name: Thread-130 >>> rob.rosloomo <<<
2022-12-19 13:44:28.894 2750-2750/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x39206f
2022-12-19 13:44:28.920 2750-2750/? I/DEBUG: eax f3cd0040 ebx f3bfca2c ecx f3cd0000 edx 00000001
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: esi 0039206f edi f3ef006c
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: xcs 00000023 xds 0000002b xes 0000002b xfs 00000097 xss 0000002b
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: eip f38b4e12 ebp e2a23d78 esp e2a23d40 flags 00210206
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: backtrace:
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: #00 pc 001a5e12 /system/lib/libart.so (art::gc::allocator::RosAlloc::RefillRun(art::Thread*, unsigned int)+290)
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: #01 pc 001a60fa /system/lib/libart.so (art::gc::allocator::RosAlloc::AllocFromRun(art::Thread*, unsigned int, unsigned int*, unsigned int*, unsigned int*)+666)
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: #02 pc 00155f8d /system/lib/libart.so (art::mirror::Object* art::gc::space::RosAllocSpace::AllocCommon<true>(art::Thread*, unsigned int, unsigned int*, unsigned int*, unsigned int*)+109)
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: #03 pc 0040571d /system/lib/libart.so (_ZN3art6mirror5Array5AllocILb0EEEPS1_PNS_6ThreadEPNS0_5ClassEijNS_2gc13AllocatorTypeEb.constprop.104+989)
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: #04 pc 00406a72 /system/lib/libart.so (artAllocArrayFromCodeResolvedRosAlloc+162)
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: #05 pc 000e5815 /system/lib/libart.so (art_quick_alloc_array_resolved_rosalloc+37)
2022-12-19 13:44:28.921 2750-2750/? I/DEBUG: #06 pc 00079bfb /data/dalvik-cache/x86/system@framework@boot.oat
2022-12-19 13:44:29.120 2750-2750/? I/DEBUG: Tombstone written to: /data/tombstones/tombstone_06
2022-12-19 13:44:29.120 3124-9562/? W/ActivityManager: Force finishing activity 1 rob.rosloomo/.MainActivity
2022-12-19 13:44:29.129 3124-3255/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!
2022-12-19 13:44:29.131 3124-9562/? E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!
2022-12-19 13:44:29.131 3124-9562/? W/ActivityManager: Exception thrown during pause
https://stackoverflow.com/users/882003/john的評論是正確的: ReleaseStringUTFChars
should only be called on strings allocated with GetStringUTFChars
。 自從我完成 JNI 以來已經有很長時間了,但是刪除了那行,我認為你還可以
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.