我正确地做了我想要的JNI(至少它有效!))但是在开发时我使用了一堆断言(只是为了确保每一步都没问题)
现在我实际上正在工作,应该检查哪些返回值,哪些可以假设将返回合理的值并且不需要检查
这里是我的一些jni电话
使用的一些支持代码// given a jni env and NVGpaint this creates a java object
// encapsulating the NVGpaint structure (nvg.Paint)
jobject createPaintJobject(JNIEnv *e, NVGpaint p)
{
jclass cls = (*e)->FindClass(e, "nvg$Paint");
assert(cls != NULL);
jmethodID constructor = (*e)->GetMethodID(e, cls, "<init>", "()V");
assert(constructor != NULL);
jobject nvgpaint = (*e)->NewObject(e, cls, constructor);
assert(nvgpaint!=NULL);
jfieldID fid = (*e)->GetFieldID(e, cls,"buff","Ljava/nio/FloatBuffer;");
assert(fid != NULL);
jobject jbuff = (*e)->GetObjectField(e, nvgpaint, fid);
assert(jbuff != NULL);
NVGpaint* ptr = (void*)(*e)->GetDirectBufferAddress(e, jbuff);
assert(ptr!=NULL);
*ptr = p;
return nvgpaint;
}
更换这些断言的最佳做法是什么,甚至还需要检查?
答案 0 :(得分:0)
更换这些断言的最佳做法是什么?
与这些断言相比,使用异常检查机制可能会更好。
env->ExceptionCheck();
env->ExceptionClear();
env->ExceptionDescribe();
env->ExceptionOccurred();
实际上,在调用那些可能引发异常的JNI函数时,你应该总是进行异常检查。