当我做了一些testing codes时,我得到了一些有效的答案,但我发现了一些其他问题(或者我认为是)。
代码如:
JNIEXPORT jint JNICALL test_jni_Native_testSet(JNIEnv *env, jclass type, jobject tdobj)
{
//Create Integer class, get constructor and create Integer object
jclass intClass = env->FindClass(env, "java/lang/Integer");
jmethodID initInt = env->GetMethodID(env, intClass, "<init>", "(I)V");
if (NULL == initInt) return -1;
jobject newIntObj = env->NewObject(env, intClass, initInt, 123);
//Now set your integer into value atttribute. For this, I would
//recommend you to have a java setter and call it in the same way
//as shown above
//clean reference
env->DeleteLocalRef(env, newIntObj);
return 0;
}
如果我用行
中的NULL替换123jobject newIntObj = env->NewObject(env, intClass, initInt, 123);
在java代码中,我通过这个本机函数设置了一个Integer参数。 似乎env-&gt; NewObject如果成功调用构造函数则不会返回NULL。 这意味着我只能使用NULL分配一个jobject而不是调用NewObject函数,并且初始化它将为NULL。
我认为这不是一个好主意。
正如http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html所说:
env->NewObject(...)
RETURNS:
Returns a Java object, or NULL if the object cannot be constructed.
所以,我的问题是:
为什么在用NULL值初始化对象时不返回NULL?
答案 0 :(得分:1)
函数NewObject
使用非类型安全的可变参数列表。如果将 NULL 传递给构造函数,它将被解释为整数值0.因此,它将成功构造一个初始化为0的 Integer 对象。