Почему мой JNI кодирует не, успешно находят getMessage метод jthrowable?

Использовать имена параметров в запросе:

Dim command As New SqlCommand("SELECT [username],[password] FROM [stud_table] WHERE [username] = @username", connection)
        command.Parameters.AddWithValue("@username", SqlDbType.NVarChar) = Me.UsernameTextBox.Text
7
задан Chris R 18 October 2008 в 22:09
поделиться

2 ответа

Хорошо, таким образом, похоже, что моя проблема была этим GetObjectClass не действует способ, к которому Вы ожидали бы это на jthrowable, или по крайней мере результаты его не полезны для целей получить методы. Замена той части кода с этим работает:

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

Ужасно нечетный, это. Я надеюсь, что это помогает кому-то еще в будущем, все же.

8
ответ дан 6 December 2019 в 23:15
поделиться

Я попробовал Ваш подход, и он работал на меня. Несколько вещей, хотя: я использую интерфейс C++ (хотя это не должно иметь значения), и я использую обновление Java 6 10, x64 выпуск, на Ubuntu 8.04. Возможно, версия Java и/или используемая платформа будут иметь значение.

#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!' для моего тестирования; не стесняйтесь пробовать различными типами исключительной ситуации!

3
ответ дан 6 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: