2014-03-12 109 views
0

我想从C++调用Java方法。Android ndk致命的信号代码= 1

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(); 
     } 
    }); 

} 

和App关闭与 03-12 23:33:29.172: A/libc(21987): Fatal signal 11 (SIGSEGV) at 0x323030b9 (code=1)

我认为我有错误的C++。谢谢

+0

发布整个堆栈跟踪,或至少更多。 –

+0

@ChrisStratton不再有趣。只有简单的openCV消息 – Artem

+0

然后找到并禁用任何异常处理程序阻止您获取堆栈跟踪。或者在ndk-gdb下运行。或者在你的本地代码中加入一些日志。但让人们猜测**错误的位置是不合理的。 –

回答

2

看起来你正在通过一个char*CallVoidMethod() - 这是错误的,你需要通过一个jstring对象。要在char *周围创建一个jstring,请使用env->NewStringUTF()

换句话说,行是这样的:

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

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

+0

谢谢。它有帮助。你太棒了) – Artem

+0

Op,建议你看看DeleteLocalRef。在这里泄漏可能没有问题,但即使如此,允许的本地引用数量也非常低,大概250个左右,所以最好在调用java方法后删除。 – weston

+0

这是高达512本地参观IIRC。可能取决于Android版本。对于这个片段并不重要,但是如果在循环中调用NewStringUTF,删除它们是有意义的。 –

1

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

不管怎么说,如果我没有遗漏什么东西,你会将char*传递给Java方法而不是jstring。您必须将fn.first转换为Java字符串,并使用JNI NewStringUTF()或类似语言。

+0

谢谢你,你是对的。我需要使用NewStringUTF() – Artem

相关问题