2012-07-06 6 views
0

현재 내 응용 프로그램에서 C++ (핵심 구현) 및 java (서비스 및 프레젠테이션)를 사용하고 있습니다. 이제 내 C++ 코어에서 JNI 코드를 잡아서 throwable 객체를 생성하고 Java 레이어에 던져 버리는 예외가 발생했습니다. 그래서 더 처리 될 수 있습니다. 나는 다음과 같은 코드를 사용하고 JNI에 예외를 잡기위한JNI에서 ctor를 호출 할 수 없습니까?

,

MyException(string str1, string str2, int cat1, int cat2); 

하지만 내 JNI 코드에서

catch (namespace::MyException& excep) { 
    jclass ex = jenv->FindClass("namespace/MyException"); 
    jmethodID constructor; 
    jthrowable object; 
    jobject obj; 
    if (ex) 
    { 
      constructor = jenv->GetMethodID(ex, "<init>", "(Ljava/lang/String;Ljava/lang/String;I;I)V"); 
      if(!constructor) 
      { 
       SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, (char*) excep.what()); 
       return $null; 
      } 

      jstring str = jenv->NewStringUTF(excep.what()); 
      jstring str2 = jenv->NewStringUTF(excep.GetStackTraceAsString()); 
      obj = jenv->NewObject(ex, constructor, str, str2,excep.GetCat(),excep.GetCate()); 

      object = static_cast<jthrowable>(obj); 
      jenv->DeleteLocalRef(str); 
      jenv->DeleteLocalRef(str2); 
      jenv->Throw(object); 
    } 
    return $null; 
} 

내 MyException 클래스의 C++ 서명이

내가 들어 methodId을 얻을 수 아니다 MyException CTOR.

JNI 코드에서 무엇이 잘못되었을 수 있는지 말해 줄 수 있습니까? 필자가 생각하기에 GetMethodId()에는 parameterList에 문제가 있습니다.

답변

3

서명의 기본 요소 사이에 세미콜론이 없어야합니다. 그것은 다음과 같이해야합니다 :

(Ljava/lang/String;Ljava/lang/String;II)V 

을 주목 II하지 I;I.


당신은 항상 당신의 내장 클래스에 대한 javap -s <package.name.ClassName>를 실행할 수 있습니다

편집.

+0

감사합니다. maba가 나를 위해 일했습니다. 하지만 왜 원시 타입에 대한 이러한 변화가 의심 스럽습니다. –

+0

세미콜론은 클래스 이름 정의를 끝내는 것입니다. ASCII라고 불리는 클래스를 상상해보십시오. 이름 서명은 어떻게 든 종료되어야합니다. 'LASCII; '. – maba

+0

JNI에서 해결할 문제를 해결할 수있는 장소를 제안 할 수 있습니까? –

관련 문제