5

我们如何在 JNI 中创建新的原始类型。我有一个返回jobject. 可以返回jint,jchar等。

有,NewString为什么没有NewInteger,,,等等。目前在 JNI 层没有自动装箱。NewCharacterNewDouble

我可以进行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。

4

2 回答 2

7

jint,jdouble等不是jobjects。正如您所说,它们是原始变量。只需填写它们!

jint someInt = 1;
jdouble someDouble = 3.14159;

重新编辑:我明白了,你想返回盒装类型,如Integer,Double等。是的,你发布的包装函数可能是要走的路。

于 2010-03-22T21:23:41.877 回答
1

为什么你觉得这种方法“开销太大”?如果您想返回一个装箱值(这是一个包含原始类型的对象,而不是“原始类型”),那么您需要创建该对象。

一种替代方法是调用valueOf()包装器类型的方法。

但是,我认为你最好返回实际的原始值,并让它在 Java 端被装箱(如果你需要的话)。


如果您担心函数/构造函数查找的开销,那么您应该缓存方法 ID。与对象指针不同,它们不会改变(有一些警告重新卸载了不适用于原始包装器的类)。请参阅此处的第 10.7 项:http: //java.sun.com/docs/books/jni/html/pitfalls.html

于 2010-03-22T21:31:52.000 回答