jnaerator:javaダイナミックライブラリの神器を呼び出し、JNAコード自動生成ツール


周知のように、javaプログラムは動的ライブラリ(.so,.dll)の関数を呼び出す場合、最も伝統的な方法はJNI技術を使用することであり、JNIでjava呼び出しインタフェースコードを書くのは非常に苦痛であり、デバッグも面倒なことであり、JNAが発売された後、開発の難しさを大幅に低減し、javaプログラマは対応する動的ライブラリにjava nativeメソッドコードを定義すれば、対応するCデータ構造にjavaオブジェクトを書けば、動的ライブラリを呼び出すためにc/c++プログラムを書く必要はありません.JNIに比べて、JNAは大きな進歩ですが、javaプログラムはjavaコードを書いてこそ、ダイナミックライブラリを正しく呼び出すことができます.ダイナミックライブラリ関数に関連するすべての構造タイプは、対応するjavaタイプを定義する必要があります.構造タイプが多い場合は、大きな作業量です.もっと簡単にできませんか.最近動的ライブラリを呼び出すことを書くのに頭が痛くて、私もJNIコードを書くことができますが、本当に面倒で、いつも近道を探して、JNAの関連資料を見て、JNAで書く必要がある関連javaコードが実はすべてとても規則的であることを発見しました.それなら、JNAコード生成を提供するオープンソースツールはありますか?
Googleで探していたのに、意外にも見つけた.これがjnaerator jnaeratorはgoogle貢献のオープンソースプロジェクトであり、JNA/BridJの呼び出しC/Object-C言語動的ライブラリに基づくjavaコードのコード生成ツールを生成するために使用される.この神器があれば、動的ライブラリを呼び出すためにコードを1行でも手動で書く必要はありません.本稿では,jnaeratorの簡単な使い方を実例として紹介する.jnaeratorはコマンドラインで実行してもよいし、mavenプラグインで実行してもよい.ここではコマンドラインの実行方法についてのみ説明する.
jarのダウンロード
コマンドラインjnaeratorを実行するには、jnaeratorのFatJarパッケージをダウンロードする必要があります.maven中央倉庫ダウンロードアドレス:http://central.maven.org/maven2/com/nativelibs4java/jnaerator/0.12/jnaerator-0.12-shaded.jar
JNAコード生成
次の図のディレクトリ構造のように、2つのdllと対応するヘッダファイルがあります.この2つのダイナミックライブラリを例に、jnaeratorを使用してJNAコードのセットを生成する方法を説明します.
├─bin
│     THFeature.dll
│     THFaceImage.dll
└─include
       THFaceImage_i.h
       THFeature_i.h

コマンドラインは次のように実行されます.
java -jar d:\download\jnaerator-0.12-shaded.jar \
    -runtime JNA \     -mode Maven \     -mavenGroupId net.gdface \     -mavenArtifactId cassdk_jna \     -o jna_code     -package net.gdface.jna     -f \     -library THFaceImage \     bin\THFaceImage.dll include\THFaceImage_i.h 
    -library THFeature \     bin\THFeature.dll include\THFeature_i.h

パラメータの説明:
  • -runtime JNA指定ターゲット実行ライブラリはJNA、-runtimeオプションの値は(大文字と小文字を区別):
  • JNA JNAerator (based on JNA)
  • BridJはC++ライブラリ
  • をサポートする
  • NodeJSしかし実測はBridJを使うのが問題があることを発見して、NodeJSは
  • を試みたことがありません
  • -mode Maven出力モードは、Maven -modeのオプションの値(大文字と小文字を区別)を指定します.
  • Jar:JARはjarパケットを生成し、-jarを使用して生成jarパケットファイル名
  • を指定することができる.
  • StandaloneJar:すべての依存ライブラリを含むjarを生成し、-jarを使用して生成するjarパッケージファイル名
  • を指定できます.
  • Directory:フォルダ
  • にコードを生成
  • Maven:maven形式のプロジェクト(pom.xml)
  • を生成
  • AutoGeneratedMaven:maven形式のプロジェクト(pom.xml)を生成し、mave install自動コンパイルを実行してjarパッケージを生成し、ソースコード
  • を生成しない.
  • -mavenGroupId net.gdfaceはmavenプロジェクトのgroupId
  • を指定する
  • -mavenArtifactId cassdk_jna指定mavenプロジェクトのartifactId
  • -o jna_code指定出力フォルダjna_code
  • -package net.gdface.jna javaコードを生成するパッケージ名を指定します.指定しない場合、デフォルトのパッケージ名はlibrary name
  • です.
  • -fコード生成時に既に存在するファイル
  • を強制上書きする.
  • -library THFaceImage -library THFeature後の動的ライブラリの名前(library name)を指定し、ここでは「THFeature.dll、指定しない場合library nameはヘッダファイル名:'THFeature_i’,NOTE:-libraryはステータスパラメータであり,その後ろのファイル名パラメータにのみ有効であるため,ここでは2回の-libraryを用いてそれぞれTHFeature_i.hTHFeature_i.hに異なるダイナミックライブラリ名
  • を指定する.
  • bin\THFeature.dll include\THFeature_i.h bin\THFeature.dll include\THFeature_i.hコードを生成する動的ライブラリと対応するヘッダファイルを指定し、前後の順序に関係なく動的ライブラリファイル名を提供することなく、必要に応じて提供することができる.hファイルはJNAコード
  • を生成することができる.
    生成されたmavenプロジェクトコード構造は次のとおりです.
    J:\WORKSPACE.NEON\CASSDK54\CASSDK\CASSDK_WINDOWS_X86_64\JNA_CODE
    │  pom.xml
    │  
    └─src
        └─main
            ├─java
            │  └─net
            │      └─gdface
            │          └─jna
            │                  EF_Param.java
            │                  FaceAngle.java
            │                  THFeatureLibrary.java
            │                  THFaceImageLibrary.java
            │                  THFI_FacePos.java
            │                  THFI_Param.java
            │                  THFI_Param_Ex.java
            │                  TH_Image_Data.java
            │                  
            └─resources
                └─lib
                    └─win64
                            THFeature.dll
                            THFaceImage.dll

    NOTE:コード生成時にbin\THFeature.dll,THFaceImage.dllが提供されない場合、生成されたフォルダにresourceフォルダはありません
    参考資料
    『jnaeratorコマンドラインパラメータ説明』