java - Android ndk 致命信号代码=1

标签 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 ) );

}
}

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):0x323030b9 处的致命信号 11 (SIGSEGV)(code=1)

我认为我在 C++ 中有错误。谢谢

最佳答案

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

换句话说,这条线是这样的:

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

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

关于java - Android ndk 致命信号代码=1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22364382/

相关文章:

java - 无法使用 JavaMail API 发送电子邮件

android - 在 Android 中将变量传递给 Kotlin 协程

android - 如何设置交错网格跨度计数以使用可用屏幕宽度?

c++ - 如何不画出场景边界?

java - 如何获取假脱机文件列表与其格式分开 - Java ( JT400 )

java - 如何将列表中的项目打印到 JTextArea?

java - 为什么 JOptionPane.showInputDialog 被调用的次数超过了应有的次数,为什么以及如何防止它

android - 如何使用onDraw(Canvas)获取WebView的位图快照(Android)

c++ - 如果我无法承受抛出异常时的低性能,我可以使用 STL 吗?

c++ - DirectX 3(三)如何将信息呈现给显示器?