ホームページ  >  記事  >  Java  >  Java が jna を使用して C# で DLL を呼び出す方法の例

Java が jna を使用して C# で DLL を呼び出す方法の例

黄舟
黄舟オリジナル
2017-09-08 10:53:452591ブラウズ

私は少し前に、サードパーティが提供する C# で書かれた DLL を使用する必要があるプロジェクトに取り組みました。そのため、この記事ではその方法を紹介します。 jna を使用して Java で C# を呼び出す方法については、サンプル コードを通じて詳しく説明されています。必要な方は一緒に参照してください。

はじめに

JNA (Java Native Access) は、ネイティブ/JNI コードを記述することなく、実行時にシステム ネイティブ ライブラリ (ネイティブ ライブラリ: Windows の dll など) に動的にアクセスするための Java ツール クラスのセットを提供します。開発者は、ターゲットのネイティブ ライブラリの関数と構造を Java インターフェイスで記述するだけで、JNA が Java インターフェイスをネイティブ関数に自動的にマップします。

利点

JNA を使用すると、通常の Java メソッドを呼び出すのと同じように、ローカル メソッドを直接呼び出すことができます。ローカルメソッドを直接実行するのとほぼ同じであり、ローカルメソッドの呼び出しには追加の処理や設定は必要なく、冗長な参照やコーディングも必要なく、非常に便利です。 JNA の最大の利点は、車輪の再発明という時間の浪費を回避できることです

JNI が Java 用に特別に生成されたヘッダー ファイルをインポートする必要があることは、JNI を使用したことのある人なら誰でも知っています。このような強制的に変更されたソース コードでコンパイルされた DLL は、侵入的な設計の一種であり、C#

JNA の説明では呼び出されません

JNA クラス ライブラリは、ローカル コードを動的に呼び出すために小さなローカル クラス ライブラリ サブルーチンを使用します。プログラマは、特定の Java インターフェイスを使用して、呼び出されるネイティブ コード メソッドの構造といくつかの基本プロパティを記述するだけで済みます。これにより、複数のプラットフォームに適応するために多くの構成コードとコンパイル コードが節約されます。 JNA が提供するパブリック jar パッケージ内のすべてのインターフェイスが呼び出されるからです。

1. 要件の説明:

プロジェクトが C# を使用して開発されており、開発の後半段階で Java チームと協力する必要があり、ビジネス ロジックの一部が C# を使用してコード完成されている場合、要件を実装するには、Java の使用を検討してください。既製の c#dll を呼び出します。数日前にたまたま仕事でそんな問題に遭遇したので開発過程をメモしてみました。

もちろん、これは単なる仮説にすぎません。具体的な状況を詳細に分析した後、個人的には、コードをリファクタリングすることが最善の方法であると考えています...

2. 原則の説明:

実際、私はそうしました。具体的な原理がよく理解できていないので、自分の考えに基づいて考えていますが、それを出発点として理解していることを話しましょう。

C# コードは .net プラットフォームでホストされているため、Java は C# コードを直接呼び出すことができないため、C++ ミドルウェアが導入され、プロジェクトを clr パブリック ランタイムに設定することで、C# の対応するメソッドを参照によって呼び出すことができます。また、jna は C++ によって生成された dll を直接呼び出すことができるため、一般的なプロセスはスムーズです。 C++ は記述された c#dll を呼び出し、その後 java は c++ によって生成された dll ミドルウェアを呼び出します。一般的なプロセスは次のとおりですが、多くの落とし穴があるため、以下で詳しく説明します。

3. 実行プラットフォーム:

システム: Windows 10 x64

開発ツール: Visual Studio 2015/2017 (ラップトップと会社のコンピューターに異なるバージョンをインストールし、実装しました) MyEclipse2014

SDK: jdk -x86、jdk-x64 (dll は x86 プラットフォームと x64 プラットフォームに分かれており、jdk のバージョンに対応している必要があります。同じコンピューターに 2 つのバージョンの jdk をインストールするのは面倒です。システム構成は jdk32-bit を使用します) 32 ビット dll をデバッグし、その後 myeclipse が自動的に 64 ビット jdk で 64 ビット dll をデバッグします)

IV. 準備:

1. まず、上記の実行プラットフォームを準備することをお勧めします。システムと同じビット数の jdk を選択します (vs、myeclipse または eclipse または sts をインストールします) ;

2. jna.jar をダウンロード: JNA ダウンロード (jna-4.4.0.jar および jna-platform-4.4 をダウンロードします。 0)、またはローカルにダウンロードすることもできます

5. CODEの開始

5.1世代c#DLL

5.1.1 vs管理者として開始します(プロジェクトにはcomコンポーネントの登録が含まれており、として開始する必要があります)管理者が完了します)、新しい c# プロジェクトを作成します

5.1.2 c# プロジェクトを設定します

まず、新しく作成した Invoke プロジェクトを右クリックし、[プロパティ] をクリックします。

プロジェクトのプロパティの設定を続けます。

必ず保存してください。

次に、呼び出す必要がある新しい CSharp クラス コードを作成します。ここでは、効果を示すために、int、string、bool をそれぞれ操作する簡単なメソッドを作成します。図に示すように:

次に、プロジェクトを右クリックして、[生成] をクリックします。

最初のステップ、完了、よくやった。

5.2 C++ミドルウェアを生成する

5.2.1 新しい C++ プロジェクトを作成してプロパティを設定します

プロジェクトが正常に作成されましたので、プロジェクトを右クリックしてプロパティを選択します。

5.2.2 c++コードを書く

cppファイルを追加する

cppファイルを編集する さて、c++とc#での作業はすべて完了したので、右クリックして生成します。

DLL で生成されたファイルのフルネームをコピーし、後で Java で使用します。

6. Java コードを作成します

6.1 新しい Java プロジェクトを作成し、DLL プラットフォームと一貫性のある JDK を必ず選択してください。次に、図に示すように、前にダウンロードした 2 つの jna jar をプロジェクトにロードします:

6.2 Java コードの作成を開始します

次に、次を実行します:

ああ、エラーが報告されました [無効です] Java は c++dll を見つけましたが、c# dll を見つけられなかったので、メモリ アクセス] で作成した c++dll のフル パス名を直接見つけることができるため、c# dll を見つける方法を説明します。答えは、c# dll を jdk の bin ディレクトリにコピーすることです。そうすれば、jvm がそれを見つけることができるようになります。

図に示すように、Invoke.dll を jdk の bin ディレクトリにコピーします:

次に実行します:

いいね! int、string、boolean などの一般的に使用される型は、異なる言語間の型の対応関係に従う限り、スムーズに転送できます。Baidu で確認できます。

7. 注意事項

7.1 java error: Exception in thread "main" java.lang.Error: Invalid Memory access

考えられる理由:

1. c#dll が jdk bin にコピーされていないディレクトリ;

2. Java と C++ の間でデータ型が一致しません。

7.1.2 java エラー: スレッド「メイン」の例外 java.lang.UnsatisfiedLinkError: ライブラリ 'D:vs WorkplaceX86InvokeTestReleaseX86CPPDlls' をロードできません: ネイティブ ライブラリ ( win32-x86/D:vs WorkplaceX86InvokeTestReleaseX86CPPDlls.dll) がリソース パス ([file:/G:/My%20Eclipse%20workplace/InvokeCSharpX86Test/bin/、file:/G:/My%20Eclipse%20workplace/InvokeCSharpX86Test/Lib) に見つかりません/jna-4.4.0.jar, file:/G:/My%20Eclipse%20workplace/InvokeCSharpX86Test/Lib/jna-platform-4.4.0.jar])

考えられる理由:

1. c++dll path が正しくありません。C++ プロジェクトのコンパイル後にコピーせずに Java プログラム内で直接呼び出せるように、テストを行うときは絶対パスを使用することをお勧めします。 2. jdk のプラットフォームが一致しません。 C++ プロジェクトは 32 ビットです。c++dll は 32 ビットでなければなりません。64 ビットでも同じです。7.1.3 Windows 64 ビットでコンパイルされた 32 ビット DLL はテストに失敗しました。私のコンピュータには仮想マシンがインストールされていないため、64 ビット システムが原因かどうかはわかりません。32 ビット システムではテストしませんでした。

概要

以上がJava が jna を使用して C# で DLL を呼び出す方法の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。