JNAプログラミング要点整理

2010 ワード

タイプ対応
  • 単純タイプ
  • 公式文書の対応表
  • 参照
  • 単純タイプの配列をパラメータとする場合も同様に対応するタイプの配列でよいが、戻り値としてメモリ
  • を処理するためにMemoryまたはBufferクラスで表す必要がある.
  • c++の多次元配列はjavaの一次元配列
  • に全長で対応する必要がある.
  • 文字列
  • javaの文字列は一般的にC++のchar*にマッピングされ、JNAは
  • を自動的に処理します.
  • Unicode(中国語)文字列がchar*に自動的に変換される場合、プラットフォームデフォルト符号化
  • が使用されることに注意してください.
  • また、C++のwchar_についてtタイプ、専用のWstringクラスでマッピングするべき
  • ポインタタイプ
  • JNAはPointerクラスと一連のサブクラスを提供し、write、read、getXXX、setXXXなどの方法で、指向するメモリを操作します.したがって、getByteArray()のような操作はメモリcopyがなく、参照を返すだけであることに注意してください.
  • intのような単純なタイプのポインタは、ByReferenceクラスのサブクラスを直接使用して
  • を表すことができる.
  • 構造体
  • は、structに対応するためにStructuresから継承されたjavaクラスを提供することを自分で定義する必要がある.パラメータがstruct配列である場合、javaでも対応するクラスの配列が直接使用されます.
  • がパラメータまたは戻り値として使用する場合、このクラスのインスタンスはC++structのポインタに相当し、メソッドのパラメータまたは戻り値がポインタではなく、伝値呼び出しである場合、javaでMyStructを使用することに対応する.ByValue.
  • が別のstructのフィールドとして使用される場合、
  • 構造体は複雑で、公式文書
  • をよく見ません.

    メモリ処理
  • 一般的なポインタタイプのパラメータは、メモリを開く必要がない場合、または戻り値や出力パラメータなどのC++プログラムから開いたメモリのみを受信する場合にPointerタイプまたはそのサブタイプを使用します.
  • javaでメモリ領域を開いてC++プログラムに渡す必要がある場合は、PointerのサブクラスMemoryを使用します.JVMはGC時にMemoryで開いているメモリ領域を自動的に解放します.
  • Pointerとサブクラスのwriteとreadメソッドを使用すると、最初のパラメータはオフセット単位がバイトであり、最後のパラメータ長はjavaの配列長であることに注意します.たとえば、長さ2の整形配列を最初に書き込むと、呼び出し時の最後のパラメータは2になるはずです.各整形数が4バイトを占めるため、2回目の書き込みを継続する場合、最初のオフセットパラメータは元のベースに2*4=8を加算する必要があります.
  • C++コードにメモリ領域が開く、パラメータとして返されると、Native.free(Pointer.nativeValue(yourPointer));
  • が使用後に解放される.
    コンパイル運転
  • C++コードには必ずextern「C」を付けて、コンパイル後の名前がソースコードと同じであることを保証します.そうしないと、識別子のエラーが見つからないと報告されます.
  • ダイナミックリンクライブラリは一般的にlib[名前]にコンパイルされる.[拡張子]の形式
  • 名前はあなたが自分でつけた名前
  • です.
  • 拡張子はプラットフォームによって異なり、linuxはso、macはdylib、windowsはdll
  • コンパイルコマンド
  • Linux/Mac下g++-dynamiclib-oターゲットファイル名*.cpp
  • javaプログラムが実行される前にダイナミックリンクライブラリが存在するパスを設定する環境変数export LD_LIBRARY_PATH=[yourPath]

  • 参考資料
    上の整理知識はよくある状況と要点のまとめで、詳細は公式ドキュメントを参考にすることができますが、実際には比較的詳細です.公式ドキュメント