Android ndk致命信号代码= 1

时间:2014-03-12 21:36:46

标签: java android c++ android-ndk

我试图从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 ) );

}
}

爪哇:

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 ++中有错误。谢谢

2 个答案:

答案 0 :(得分:2)

您似乎正在将char*传递给CallVoidMethod() - 这是错误的,您需要传递jstring个对象。要在char *周围创建一个jstring,请使用env->NewStringUTF()

换句话说,这一行是这样的:

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

假设字符串确实是UTF-8。如果它在另一个代码页(例如CP1251)中并且可能包含非ASCII字符,则需要转换。

答案 1 :(得分:1)

您的代码中没有验证。我希望这篇文章被删除了。您应该检查clazzmethod是否有效。

无论如何,如果我没有遗漏某些内容,则将char*传递给Java方法而不是jstring。您必须将fn.first转换为JNI NewStringUTF()或类似的Java字符串。