質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top