一jnaの概要


プロジェクトではjavaで会社のsdkライブラリを呼び出す必要があるためです.だからjniを使います;jniの操作は非常に面倒で、javaインタフェースを定義し、cのヘッダファイルを生成する必要があります.そして両側が似合う.開発者はjava言語を熟知するだけでなく、cに対してもかなり熟知しなければならない.2人に分かれて完成するにはコミュニケーションコストが必要です.だからjnaフレームワークを採用する必要があります.Java側でのみdllまたはsoファイルを直接呼び出します.
 
紹介JNA(Java Native Access)フレームワークはオープンソースのJavaフレームワークであり、SUN社が主導して開発した、古典的なJNIの基礎の上に構築されたフレームワークである.
JNA動作原理
 
JNAはJNIテクノロジーの基礎の上に構築されたJavaクラスライブラリで、javaを使用してダイナミックリンクライブラリの関数に直接アクセスすることができます.
 
JNIを使用するには、手動でCで動的リンクライブラリを書き、C言語でJavaのデータ型をマッピングする必要があります.
 
JNAでは、JavaとCのデータ型マッピングを自動的に実現できる動的なC言語作成のリピータを提供しています.Cダイナミックリンクライブラリを作成する必要はありません.
 
もちろん、これは、JNAテクノロジーを使用すると、JNIテクノロジーを使用してダイナミックリンクライブラリを呼び出すよりもパフォーマンスが低下することを意味します.速度が何倍も下がるかもしれません.しかし、影響は大きくない.
 
 
JNA技術の難点
 
1、現在のパスはbin出力ディレクトリではなくプロジェクトの下にあります.
 
2,データ構造の対応関係
 
 
Java-CとOSデータ型の対応表
Java Type
C Type
Native Representation
boolean
int
32-bit integer (customizable)
byte
char
8-bit integer
char
wchar_t
platform-dependent
short
short
16-bit integer
int
int
32-bit integer
long
long long, __int64
64-bit integer
float
float
32-bit floating point
double
double
64-bit floating point Buffer Pointer
pointer
platform-dependent (32- or 64-bit pointer to memory)
[] (array of primitive type)
pointer array
32- or 64-bit pointer to memory (argument/return) contiguous memory (struct member)
JNAは、上記のタイプに加えて、一般的なデータ型のマッピングもサポートします.String
char*
NUL-terminated array (native encoding or jna.encoding ) WString
wchar_t*
NUL-terminated array (unicode) String[]
char**
NULL-terminated array of C strings WString[]
wchar_t**
NULL-terminated array of wide C strings Structure
struct* struct
pointer to struct (argument or return) ( or explicitly ) struct by value (member of struct) ( or explicitly ) Union
union
same as Structure Structure[]
struct[]
array of structs, contiguous in memory Callback
(*fp)()
function pointer (Java or native) NativeMapped
varies
depends on definition NativeLong
long
platform-dependent (32- or 64-bit integer) PointerType
pointer
same as Pointer
 
 
JNAプログラミングプロセス
 
JNAはdll/.soファイルをJavaインタフェースと見なしています.
DllはC関数の集合,コンテナであり,これはインタフェースの概念と一致している.
 
    このようなインタフェースを定義します
public interface TestDll1 extends Library {
                  /**
                    * 現在のパスはbin出力ディレクトリではなくプロジェクトの下にあります.
                    */
                   TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class);
                   public void say(WString value);
                  
         }
 
 
dllがstdcall形式で関数を出力する場合は、StdCallLibraryを継承します.そうでない場合は、デフォルトのLibraryインタフェースを継承します.
 
インタフェースの内部には、共通の静的定数:instanceが必要です.
 
TestDll1 INSTANCE = (TestDll1)Native.loadLibrary("TestDll1", TestDll1.class);
 
この定数により、このインタフェースのインスタンスを取得し、インタフェースのメソッドを使用することができます.つまり、外部dllの関数を呼び出します.
 
注意:
1,Native.loadLibrary()関数には2つのパラメータがあります.
    1,dllまたは.soファイルの名前ですが、接尾辞名は付きません.これはJNIの仕様に合っています.接尾辞名を付けるとオペレーティングシステムプラットフォームにまたがることができないからです.
dllを検索するパスは次のとおりです.
1)プロジェクトのルート
2)オペレーティングシステムのグローバルパス、
3)pathで指定したパス.
 
2,2番目のパラメータは本インタフェースのClassタイプです.
 
JNAはこのClassタイプで、指定したdll/.soファイルに基づいてインタフェースのインスタンスを動的に作成します.
 
2,インタフェースでは必要な関数や共通変数を定義するだけで、必要でないものは定義しなくてもいいです.
public void say(WString value);
 
パラメータと戻り値のタイプは、dllのC関数のタイプと一致するはずです.
これはJNA、さらにはすべてのプラットフォーム間呼び出しの難点です.
 
ここで、C言語の関数パラメータは、wchar_t*である.
JNAで対応するJavaタイプはWstirngです.