簡體   English   中英

Android NDK致命信號代碼= 1

[英]Android ndk Fatal signal code=1

我正在嘗試從c ++調用Java方法。

C ++

JNIEXPORT void JNICALL Java_ru_sploid_platerecog_RecogActivity_FindFeatures(JNIEnv* env, jobject job, jlong addr_rgba)
{
Mat& m_rgba = *(Mat*)addr_rgba;

try
{
    const pair< string, int > fn = read_number( m_rgba, 10 );
    jclass clazz = env->FindClass("ru/sploid/platerecog/RecogActivity");
    jmethodID meth=env->GetMethodID(clazz,"onGetNumber","(Ljava/lang/String;)V");
    env->CallVoidMethod(job,meth,fn.first.data());
//  cv::putText( m_rgba, fn.first.empty() ? string( "not found" ) : fn.first, cv::Point( 20, 100 ), CV_FONT_HERSHEY_PLAIN, 2.0, cv::Scalar( 255, 0, 0, 0 ) );
}
catch ( const std::exception& e )
{
    cout << "Catch exception: " << e.what() << endl;
    cv::putText( m_rgba, "Exception", cv::Point( 20, 100 ), CV_FONT_HERSHEY_PLAIN, 2.0, cv::Scalar( 255, 0, 0, 0 ) );

}
}

Java:

public void onGetNumber(String plate){
    plat=plate;
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if (plat!=null)
                Toast.makeText(getApplicationContext(), plat, Toast.LENGTH_LONG).show();
            else
                Toast.makeText(getApplicationContext(), "((", Toast.LENGTH_LONG).show();
        }
    });

}

應用程序以03-12 23:33:29.172: A/libc(21987): Fatal signal 11 (SIGSEGV) at 0x323030b9 (code=1)

我認為我在C ++中有錯誤。 謝謝

看起來您CallVoidMethod() char*傳遞給CallVoidMethod() -這是錯誤的,您需要傳遞jstring對象。 要在char *周圍創建一個jstring,請使用env->NewStringUTF()

換句話說,該行如下所示:

env->CallVoidMethod(job,meth,env->NewStringUTF(fn.first.data()));

假設字符串確實在UTF-8中。 如果它在另一個代碼頁中(例如CP1251),並且可能包含非ASCII字符,則需要進行轉換。

您的代碼中沒有驗證。 我希望這個職位被刪掉。 你應該檢查clazzmethod是有效的。

無論如何,如果我沒有丟失任何內容,您可以將char*傳遞給Java方法而不是jstring。 您必須使用JNI NewStringUTF()或類似方法將fn.first轉換為Java字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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