5

JNI で新しいプリミティブ型を作成するにはどうすればよいですか。を返す関数がありますjobjectjintjcharなどの返品が可能です。

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;

再編集:なるほど、 、 などのボックス化された型を返したいと思います。ええ、投稿したラッパー関数はおそらく行く方法です。IntegerDouble

于 2010-03-22T21:23:41.877 に答える
1

このアプローチが「オーバーヘッドが多すぎる」と感じるのはなぜですか。ボックス化された値(「プリミティブ型」ではなくプリミティブを保持するオブジェクト)を返したい場合は、そのオブジェクトを作成する必要があります。

valueOf()1つの代替方法は、ラッパータイプでメソッドを呼び出すことです。

ただし、実際のプリミティブ値を返し、Java側になったら(必要に応じて)ボックス化する方がよいと思います。


関数/コンストラクタールックアップのオーバーヘッドが心配な場合は、メソッドIDをキャッシュする必要があります。オブジェクトポインタとは異なり、それらは変更されません(プリミティブラッパーに適用されないアンロードされたクラスに関するいくつかの警告があります)。ここで項目10.7を参照してください:http://java.sun.com/docs/books/jni/html/pitfalls.html

于 2010-03-22T21:31:52.000 に答える