2

I am trying to write a wrapper for a dynamic library that I do not have all of the source code for, just as most people who use JNI seem to be trying to do.

What I need to do is call the constructor of a C++ class with a Java wrapper class and then use that C++ class instance for all further native methods through the Java class's instance. This works fine as long as there is only ever one instance of the Java class, as soon as a new instance is made the old C++ instance is overwritten with a new one. I must be able to create multiple instances as each instance handles a single sensor.

Is there any way to elegantly tie the Java class instance to the C++ class instance?

Disclaimer:I am not a C++ programmer any more than a monkey is a human. Even the simplest answers on the C++ end might help.

4

3 に答える 3

3

ピア クラスの概念に慣れる必要があります。

これについては、Sun (またはうるさい場合は Oracle) のオンライン ブックPeer Classesで詳しく説明されています。

于 2012-08-09T08:07:46.720 に答える
0

ピアクラスを完全に認識していないので、次のことを行いnative void register()ます。ペアにしたいJavaクラスに(またはそのような)を入れます。C JNI 部分でGlobalRefは、呼び出しjobjectの a をキーとして に格納しstd::map<jobject,NativeImplementationObject>ます。GlobalRefJVM へのコールバックを簡素化するために、コンストラクターを介して C++ オブジェクトにキーを設定できます。JVM からセンサー関連のネイティブ メソッドへの後続の呼び出しでは、現在呼び出しているジョブジェクトと比較しNativeImplementationObjectて右側を検索します。IsSameObject次に、そのオブジェクトへの呼び出しを単純に「転送」します。JNI スタブの実装は、マップを保持する単なるシン ディスパッチャになります。もちろん、適切なタイミングですべてのオブジェクトとグローバル ref を削除することには重要な部分がありますが (自動 JVM ではありません)、ここでは説明できません。

もう一度考えてみると、センサーの数が適度に大きい (少なくとも数十のオーダー) か、前述のIsSameObject. 構造体の単純なリストでも同様です (サルと人間の両方で)。

于 2012-08-10T21:37:53.837 に答える
0

Java クラスを Singleton にして、Java クラスの他のインスタンスが作成されないようにすることができます。これがあなたができる解決策だと思います

于 2012-08-09T03:55:26.583 に答える