簡體   English   中英

致命信號 11 (SIGSEGV),在第二次 JNI String 調用 Java 方法之后

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM