我想要一种在 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/