2014-03-12 2 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)); 

} 
} 

자바 : 나는 C++에 오류가 있다고 생각 03-12 23:33:29.172: A/libc(21987): Fatal signal 11 (SIGSEGV) at 0x323030b9 (code=1)

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

} 

그리고 응용 프로그램이 닫힙니다. 고마워요

+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입니다. 아마 안드로이드 버전에 달려 있습니다. 이 스 니펫에서는 중요하지 않지만 루프에서 NewStringUTF를 호출하면이를 삭제하는 것이 좋습니다. –

1

코드에 유효성 검사가 없습니다. 나는 이것이이 게시물을 위해 잘려 졌기를 바랍니다. clazzmethod이 유효한지 확인해야합니다.

어쨌든 누락 된 것이 없다면 char*을 jstring 대신 Java 메소드에 전달합니다. fn.first을 JNI NewStringUTF() 또는 그와 비슷한 Java 문자열로 변환해야합니다.

+0

감사합니다. NewStringUTF()를 사용해야합니다. – Artem

관련 문제