我们如何在JNI中使用新的原始类型。我有一个返回jobject
的函数。可以返回jint
,jchar
等
有NewString
,为什么不NewInteger
,NewCharacter
,NewDouble
等。目前JNI层没有自动装箱。
我可以使用NewObject
调用,但创建基本类型的开销太大。
jobject NewInteger(JNIEnv* env, jint value)
{
jclass cls = FindClass(env, "java/lang/Integer");
jmethodID methodID = GetMethodID(env, cls, "<init>", "(I)V", false);
return env->NewObject(cls, methodID, value);
}
我有包装函数来获取Class和MethodID。
答案 0 :(得分:7)
jint
,jdouble
等不是jobjects
。如你所说,它们是原始变量。只需填写它们!
jint someInt = 1;
jdouble someDouble = 3.14159;
重新编辑:我知道,您想要返回盒装类型,例如Integer
,Double
等。是的,您发布的包装函数可能是要走的路
答案 1 :(得分:1)
为什么你觉得这种做法“太多开销”?如果要返回一个盒装值(这是一个包含基元的对象,而不是“基本类型”),那么您需要创建该对象。
另一种方法是在包装器类型上调用valueOf()
方法。
但是,我认为你最好还是返回实际的原始值,并且一旦它在Java端就让它被盒装(如果你需要的话)。
如果您担心函数/构造函数查找的开销,那么您应该缓存方法ID。与对象指针不同,它们不会改变(有些警告重新卸载不适用于原始包装器的类)。请参见此处的第10.7项:http://java.sun.com/docs/books/jni/html/pitfalls.html