문제

내가 액세스하려고 하는 메시지에 jthrowable 동안 나눠 예외가 생성 된 때 나는 실패를 찾을 수 있습니다.그러나 나는 액세스 할 수없는 메시지의 ID getMessage()에 jthrowable 체,그리고 나는 왜 그런지 몰랐습니다.나는 시도했다 변화의 서명 getMessage 를"()Ljava/eng/문자열"(이 없는 세미콜론에서 종료,하지만 그 필요 맞죠?) 이 없는 기쁨입니다.나는 혼란으로 지옥이다.이 시도체 getMessage with toString,고 작동 하지 않았다.분명히 내가 뭔가 잘못 사소 here.

여기에는 코드 사용:

jthrowable java_exception;
jclass java_class;
jmethodID method;

java_exception = (*jEnv)->ExceptionOccurred(jEnv);
assert (java_exception != NULL);
java_class = (*jEnv)->GetObjectClass (jEnv, java_exception);
assert (java_class != NULL);
method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");
if (method == NULL) {
printf ("Seriously, how do I get here?!\n");
(*jEnv)->ExceptionDescribe (jEnv);
return;
}

의 출력이드(다른 것들 사이에)는 다음과 같습니다:

심각하게,나는 어떻게 여기에서 얻을 수 있습니까?!
예외는 스레드에서"주"java.랭.NoClassDefFoundError:com/planet/core360/docgen/프로세서

javap -p -s java.lang.Throwable 나이:

컴파일에서"Throwable.java"
public class java.랭.Throwable 확장 java.랭.객체를 구현하 java.io.Serializable{
...
공공 java.랭.문자열 getMessage();
서명:()Ljava/eng/String;
...

도움이 되었습니까?

해결책

좋아요,그래서 그것을 내는 것이 문제였 GetObjectClass 하지 않는 방식으로 행동할에 jthrowable,또는 적어도의 결과는 그것에 유용하지 않은 목적으로 얻는 방법이 있습니다.대체된 부분의 코드와 함께 이동:

java_class = (*jEnv)->FindClass (jEnv, "java/lang/Throwable");
method = (*jEnv)->GetMethodID (jEnv, java_class, "getMessage", "()Ljava/lang/String;");

도단로,이상한다.이 도움이 되었으면 좋겠습니다 누군가가 다른 사람은 미래에,하지만.

다른 팁

나의 접근 방식을 사용하고 있으며,이는 나를 위해 일했습니다.몇 가지만:내가 사용하여 C++인터페이스(그러나지 않는 차이를 만들어),사용하고 있는데 Java6 업데이트 10,x64edition,Ubuntu8.04.아마도 자바 버전 그리고/또는 사용한 플랫폼이 변화를 일으킬 수도 있습니다.

#include <cstdio>
#include <jni.h>

int
main(int argc, char** argv)
{
    if (argc != 3) {
        std::fprintf(stderr, "usage: %s class message\n", argv[0]);
        return 1;
    }

    JavaVM* jvm;
    void* penv;
    JavaVMInitArgs args = {JNI_VERSION_1_6};

    if (jint res = JNI_CreateJavaVM(&jvm, &penv, &args)) {
        std::fprintf(stderr, "Can's create JVM: %d\n", res);
        return -res;
    }

    JNIEnv* env(static_cast<JNIEnv*>(penv));
    jint vers(env->GetVersion());
    std::printf("JNI version %d.%d\n", vers >> 16, vers & 0xffff);

    env->ThrowNew(env->FindClass(argv[1]), argv[2]);
    jthrowable exc(env->ExceptionOccurred());
    std::printf("Exception: %p\n", exc);
    if (exc) {
        jclass exccls(env->GetObjectClass(exc));
        jclass clscls(env->FindClass("java/lang/Class"));

        jmethodID getName(env->GetMethodID(clscls, "getName", "()Ljava/lang/String;"));
        jstring name(static_cast<jstring>(env->CallObjectMethod(exccls, getName)));
        char const* utfName(env->GetStringUTFChars(name, 0));

        jmethodID getMessage(env->GetMethodID(exccls, "getMessage", "()Ljava/lang/String;"));
        jstring message(static_cast<jstring>(env->CallObjectMethod(exc, getMessage)));
        char const* utfMessage(env->GetStringUTFChars(message, 0));

        std::printf("Exception: %s: %s\n", utfName, utfMessage);
        env->ReleaseStringUTFChars(message, utfMessage);
        env->ReleaseStringUTFChars(name, utfName);
    }
    return -jvm->DestroyJavaVM();
}

jnitest java/lang/InternalError 'Hello, world!' 한 테스트하고 다른 예외 유형이 있다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top