1

バックグラウンド

JNI (NDK を使用) を使用して Java と C/C++ の両方でコーディングする Android プロジェクトがあります。

すべての Jni 操作を単独で実行する Java 側で Jni Java ラッパーを作成しましたが、このラッパー以外に他の Java クラスが直接 jni 操作にアクセスすることはできません。

問題

問題は、このラッパーの複数のインスタンスを作成したいのですが、Jni 部分には Jni ラッパーごとにインスタンスが必要です。

Jni パーツはすべてのインスタンスに対して同じフィールドを保持するため、これは問題です。

質問

jni ラッパーの各 Java インスタンスに対して、jni 部分にインスタンスが存在するように、この問題を解決するにはどうすればよいですか?

すべてのフィールドを C++ クラスに入れ、JniWrapper の CTOR 用に新しいインスタンスを返す init() 関数を用意し、それ以降、フィールドを必要とする各 JNI 関数用にできるのではないかと考えていました。 、このクラスをパラメーターとして取得します。このリンクに示されているように、ポインターである可能性があります。

悲しいことに、私はそれを行う方法がわかりません。

誰でも助けてもらえますか?

サンプル

問題を理解していない人のために物事をより明確にすることを願っているサンプルコードを次に示します。

Java 部分:

public class JniWrapper
  {
  static
    {
    System.loadLibrary("JniTest");
    }

  private native void foo(Bitmap bitmap);
  }

jni部分:

...
// sadly, all of those fields are actually a global fields
int _intField;
float _floatField;    
//those are just sample fields. i would also like to store pointers and objects...

JNIEXPORT void JNICALL ...foo(JNIEnv * env, jobject obj, jobject bitmap)
  {
  // do something with the fields, as if they all belong to the JniWrapper, 
  // and no other instances of JniWrapper are allowed to change them
  }
4

2 に答える 2