JNI新しいプリミティブタイプ
-
21-09-2019 - |
質問
JNIの新しい原始的なタイプはどうすればよいでしょうか。 aを返す関数があります 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);
}
クラスとMethodIDを取得するためのラッパー機能があります。
解決
jint
, jdouble
, 、などはそうではありません jobjects
. 。あなたが言うように、それらは原始変数です。それらを記入するだけです!
jint someInt = 1;
jdouble someDouble = 3.14159;
再編集:わかります、あなたは戻りたい 箱入り のようなタイプ Integer
, Double
, 、ええ、あなたが投稿したラッパー関数はおそらく行く方法です。
他のヒント
なぜこのアプローチは「オーバーヘッドが多すぎる」と感じるのですか?箱入りの値(「プリミティブタイプ」ではなく原始的なオブジェクトであるオブジェクト)を返したい場合は、そのオブジェクトを作成する必要があります。
1つの選択肢は、電話をかけることです valueOf()
ラッパータイプのメソッド。
しかし、実際のプリミティブ値を返し、それがJava側にいたら(必要に応じて)箱入りをさせる方が良いと思います。
関数/コンストラクタールックアップのオーバーヘッドが心配な場合は、メソッドIDをキャッシュする必要があります。オブジェクトポインターとは異なり、それらは変更されません(いくつかの警告は、原始ラッパーに適用されないクラスをロードします)。ここでアイテム10.7を参照してください: http://java.sun.com/docs/books/jni/html/pitfalls.html