java - 在 JNI 代码中抛出异常的最佳方法?

标签 java exception-handling java-native-interface

我想要一种在 JNI 代码中抛出异常的一致且简单的方法;处理链式异常的东西(隐含地来自 env->ExceptionOccurred 方法,或显式地通过参数,任何一种方式都很好)并且每次我想这样做时都可以节省我查找构造函数的时间。以上所有内容最好用 C 语言编写,尽管我可以根据需要从 C++ 翻译它。

SO 上有没有人可以分享类似的东西?

最佳答案

我们只是为我们想要抛出的每种异常类型编写实用方法。以下是一些示例:

jint throwNoClassDefError( JNIEnv *env, char *message )
{
    jclass exClass;
    char *className = "java/lang/NoClassDefFoundError";

    exClass = (*env)->FindClass( env, className);
    if (exClass == NULL) {
        return throwNoClassDefError( env, className );
    }

    return (*env)->ThrowNew( env, exClass, message );
}

jint throwNoSuchMethodError(
        JNIEnv *env, char *className, char *methodName, char *signature )
{

    jclass exClass;
    char *exClassName = "java/lang/NoSuchMethodError" ;
    LPTSTR msgBuf;
    jint retCode;
    size_t nMallocSize;

    exClass = (*env)->FindClass( env, exClassName );
    if ( exClass == NULL ) {
        return throwNoClassDefError( env, exClassName );
    }

    nMallocSize = strlen(className) 
            + strlen(methodName)
            + strlen(signature) + 8;

    msgBuf = malloc( nMallocSize );
    if ( msgBuf == NULL ) {
        return throwOutOfMemoryError
                ( env, "throwNoSuchMethodError: allocating msgBuf" );
    }
    memset( msgBuf, 0, nMallocSize );

    strcpy( msgBuf, className );
    strcat( msgBuf, "." );
    strcat( msgBuf, methodName );
    strcat( msgBuf, "." );
    strcat( msgBuf, signature );

    retCode = (*env)->ThrowNew( env, exClass, msgBuf );
    free ( msgBuf );
    return retCode;
}

jint throwNoSuchFieldError( JNIEnv *env, char *message )
{
    jclass exClass;
    char *className = "java/lang/NoSuchFieldError" ;

    exClass = (*env)->FindClass( env, className );
    if ( exClass == NULL ) {
        return throwNoClassDefError( env, className );
    }

    return (*env)->ThrowNew( env, exClass, message );
}

jint throwOutOfMemoryError( JNIEnv *env, char *message )
{
    jclass exClass;
    char *className = "java/lang/OutOfMemoryError" ;

    exClass = (*env)->FindClass( env, className );
    if ( exClass == NULL ) {
        return throwNoClassDefError( env, className );
    }

    return (*env)->ThrowNew( env, exClass, message );
}

这样,很容易找到它们,您的代码完成编辑器将帮助您输入它们,并且您可以传递简单的参数。

我相信您可以扩展它以处理链式异常或其他更复杂的方法。这足以满足我们的需求。

关于java - 在 JNI 代码中抛出异常的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/230689/

相关文章:

iphone - 整个应用程序中的异常处理

c - 为什么 GCC 编译的 C 程序需要 .eh_frame 部分?

java - 我如何从一个文件中的类调用以使用着色器显示在另一个包含 gl 代码的文件中(这两个文件都在 jni 文件夹中)?

java - 尝试使用 corbaloc url 连接到 CORBA 服务

c# - 为什么不能捕获内部异常?

Ubuntu 中的 java.lang.UnsatisfiedLinkError

java - 两个不同 Java 文件中的相同 JNI 方法

java - 在 Android CountDownTimer 中正确显示分钟

java - 如何替换包含双引号的字符?

java - 如何判断数组索引是否存在?