JAVAがJNative学習のダイナミックリンクライブラリDLLを呼び出す。
JAVAは、ダイナミックリンクライブラリDLLのメソッドを呼び出します。JNI (Java Native Interface)、JInvoke、JNative (Java to Native Interface)、JNIはJAVA自身が提供するメソッド、JInvokeはどこからかわからないが、有料登録が必要なようで、64bit JNativeはオープンソースだが、それに関するドキュメントが非常に少なく、更新も止まっているようである。JNativeのソースアドレス: http://jnative.cvs.sourceforge.net/viewvc /jnative/、jarパッケージのダウンロードアドレス: http://sourceforge.net/projects/jnative/files/jnative/.
開発環境です。 myeclipse-10.7-offline-installer-windows
ファイル" 新規" JAVAプロジェクトを作成します。
プロジェクト名を入力し、quot;Finish"をクリックします。
マウスの右ボタン「"New"」クラスをクリックします。
パッケージ名、クラス名を入力し、"public static void main(String[] args)"をチェックして、"Finish"をクリックします。
プロジェクトファイルのディレクトリを開く。
このディレクトリにDLLファイル "EhfscliaxDll"をコピーしてください。 VS2010は、ダイナミックリンクライブラリDLLとユニットテストケースを書き、DLLを呼び出して正しさをテストします。
新しい"lib"フォルダを作成し、JNative.jarをこのディレクトリにコピーしてください。
コンパイルディレクトリを設定します。
外部JARの追加]をクリックし、jarパッケージを追加します。
ヘルパークラスのコードです。
package com.ehfscliax;
import org.xvolks.jnative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
public class Helper {
/**
* @param args
* @throws NativeException
*/
public static void main(String[] args) throws NativeException {
JNative.setLoggingEnabled(true);
try {
JNative getUrl = new JNative("EhfscliaxDll.dll", "getUrl"); // Create the JNative object for the getUrl method
getUrl.setRetVal(Type.STRING); //set the return value type to: String
getUrl.setParameter(0, "127.0.0.1"); //set the parameter values needed by the method in order
getUrl.setParameter(1, 10087);
getUrl.setParameter(2, 123);
getUrl.invoke(); // invoke the method
System.out.println(getUrl.getRetVal()); //output return value
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
JNative getPlayUrl = new JNative("EhfscliaxDll.dll", "getPlayUrl");
getPlayUrl.setRetVal(Type.INT); //this method defines the return value type in the DLL as: const wchar_t*, if you set the return value type as: String, you can only get the first character of the return value
String mgrIp = "127.0.0.1";
Pointer ptr = Pointer.createPointerFromString(mgrIp);
getPlayUrl.setParameter(0, ptr);
getPlayUrl.setParameter(1, 10087);
getPlayUrl.setParameter(2, 123);
getPlayUrl.invoke();
// personally understand getRetValAsInt is to get the pointer address of the returned value, getUnicodeMemoryAsString method reads the string from the memory of the pointer address
String url = JNative.getUnicodeMemoryAsString(getPlayUrl.getRetValAsInt());
System.out.println(url);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
実装結果です。
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [loadLibrary]: Successfully loaded library 'EhfscliaxDll.dll', functionName = getUrl : hModule = 268435456
http://中文127.0.0.1:10087
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.pointers.memory.MemoryBlockFactory] [setPreferredMemoryType]: Using org.xvolks.jnative. HeapMemoryBlock memory reservation strategy
http://-�17001:10087
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [unLoad]: Unloading native library 'EhfscliaxDll.dll'
getUrlメソッドの戻り値の型は: const char*、結果は正常、getPlayUrlの戻り値の型は: const wchar_t*、戻り値はgetUnicodeMemoryAsStringで読み込まれるが、最初の文字ではなく中国語の文字化けの問題は解決していない。
<スパン この学習プロジェクトのソースコードは、以下のサイトでダウンロードできます。 http://download.csdn.net/detail/testcs_dn/7400203
以下のような問題が発生することがあります。
<スパン <スパン
<スパン System.loadLibraryが生成する例外をキャッチするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例