問題タブ [java-native-interface]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Maven を使用して JNI でプロジェクトをビルド/デプロイ/使用する
Maven を使用して、OpenCV コンピューター ビジョン ライブラリの JNI ラッパーに依存するプロジェクトを構築しようとしています。FreeHEP の NAR Maven プラグインを使用して、http: //ubaa.net/shared/processing/opencv/で OpenCV ラッパーを "maven-ize" することができましたが、そのプラグインのドキュメントはやや不足しています。
OpenCV jni プロジェクト (OpenCVJava と呼んでいます) に依存するプロジェクト (imagedetect) を作成できました。imagedetect はコンパイルしますが、すべてのテスト、統合テスト、またはパッケージ ターゲットは失敗し、java.library.path にライブラリが見つからないというエラーが表示されます。
これは特にイライラします。これを解決する唯一の方法は、opencv ライブラリの .nar ファイルを追跡し、それらを手動で抽出し、java.library.path を設定してから、gnaraly Java コマンドを呼び出して実際に実行することです。適切なクラスパス/ライブラリ パスを持つテスト/アプリケーション。これは機能しません。特に、この問題が推移的な依存関係に続く場合はなおさらです。
このビルド/テスト/実行システムをよりクリーンにするにはどうすればよいですか? 私は FreeHEP に固執していませんが、maven を使い続けたいと思っています。これにより、最も一般的なユースケースがはるかに簡単になるからです。
FreeHEP Nar プラグイン: http://java.freehep.org/freehep-nar-plugin/intro.html
java - JNIを介してC++からJavaに2バイト(WCHAR)文字列を渡す
JNIを介してC++DLLを使用するJavaアプリケーションがあります。DLLのメソッドのいくつかは文字列引数を取り、それらのいくつかは文字列を含むオブジェクトも返します。
現在、DLLはUnicodeをサポートしていないため、文字列の処理はかなり簡単です。
- JavaはString.getBytes()を呼び出し、結果の配列をDLLに渡します。DLLはデータをchar*として処理します。
- DLLはNewStringUTF()を使用して、constchar*からjstringを作成します。
現在、UnicodeをサポートするようにDLLを変更し、TCHAR型(UNICODEが定義されている場合はWindowsのWCHARデータ型を使用)の使用に切り替えています。DLLの変更は順調に進んでいますが、コードのJNI部分を変更する方法がわかりません。
私が今考えることができる唯一のことはこれです:
- JavaはString.getBytes(String charsetName)を呼び出し、結果の配列をDLLに渡します。DLLはデータをwchar_t*として扱います。
- DLLは文字列を作成しなくなりましたが、代わりに生の文字列データとともにjbyteArraysを渡します。Javaは、String(byte [] bytes、String charsetName)コンストラクターを使用して、実際にStringを作成します。
このメソッドの唯一の問題は、使用する文字セット名がわからないことです。WCHARは2バイトの長さなので、UTF-16であると確信していますが、Java側には3つの可能性があります。UTF-16、UTF-16BE、およびUTF-16LE。バイトオーダーが何であるかを教えてくれるドキュメントは見つかりませんでしたが、いくつかの簡単なテストからおそらく理解できます。
もっと良い方法はありますか?可能であれば、DLL内でjstringオブジェクトを作成し続けたいと思います。そうすれば、これらのメソッドの使用法を変更する必要がなくなります。ただし、NewStringJNIメソッドは文字セット識別子を取りません。
java-native-interface - JNIを介して生の画像データをJavaに読み込もうとしています
JNI を使用して、次の形式で生の画像データを取得しています。
画像データは、画像の左上から右下に、各行が左から右に進む線形配列のピクセルあたり DATA32 (32 ビット) の形式で返されます。各ピクセルには、上位 8 ビットがアルファ チャネルとしてあり、下位 8 ビットが青チャネルであるため、ピクセルのビットは ARGB (最上位から最下位まで、チャネルごとに 8 ビット) です。ある時点でデータを戻す必要があります。
C では、DATA32 形式は基本的に unsigned int です。
だから私は int[] 配列を取得し、それから Buffered Image を作成しようとします
f は、ピクセル データの配列です。
Java のドキュメントによると、これは BufferedImage.TYPE_INT_ARGB が次のように動作するはずです。
整数ピクセルにパックされた 8 ビット RGBA カラー コンポーネントでイメージを表します。画像には、アルファ付きの DirectColorModel があります。このイメージのカラー データは、事前にアルファが乗算されていないと見なされます。この型を BufferedImage コンストラクターの imageType 引数として使用すると、作成されるイメージは JDK1.1 以前のリリースで作成されたイメージと一致します。
8ビットRGBAでない限り、すべてのコンポーネントを合計して8ビットでエンコードすることを意味しますか? しかし、これは不可能です。
このコードは機能しますが、生成される画像は、生成されるはずの画像とはまったく異なります。大量のアーティファクトがあります。誰かがここで何か明らかに間違っているのを見ることができますか?
でピクセルデータを取得することに注意してください
私のCコードでは、api http://docs.enlightenment.org/api/imlib2/html/imlib2_8c.html#17817446139a645cc017e9f79124e5a2でライブラリimlib2を使用しています
java - UnsatisfiedLinkError を回避するには、JNI のネイティブ ライブラリをどのようにロードすればよいですか?
Eclipse と gcc (フレーバーがある場合は Ubuntu の標準的なもの) を使用して、Ubuntu 8.10 で JNI を使用したいと考えています。
make ファイルがライブラリを正常に作成しているにもかかわらず、ライブラリをロードできないようです。
主な Java クラスは次のとおりです。
私のメイクファイルはそのままです。
コードの残りの部分 (Hello.c) は、人が考えているように見えます。
私が得ているエラーは次のとおりです。
明示的なパスを使用する場合:
その後、動作しますが、可能であれば明示的なパスを使用したくありません。
java - JNI/C ライブラリをデバッグするには?
ここでは、Java JNI を使用して C ライブラリ内の関数を呼び出すシステムがあります。すべてが Solaris 上で実行されます。
文字列エンコーディングのどこかに問題があります。C で記述された関数ではアラビア文字が返されますが、JNI メソッドは別のエンコーディングの文字列を受け取ります。私はすでに $NLS_LANG を設定し、同じ方法でエンコードするための vm パラメータを設定しようとしましたが、何も機能しませんでした。そのため、C コードと Java JNI を一緒にデバッグできる必要があります。
それをデバッグする最良の方法は何ですか?
java - lotus-notesプラグインのUnsatisfiedLinkError
ノートプラグインのdllに問題があります。
これを呼び出すと:NotesFactory.createSession();
このエラーが発生します:
ビューを作成できません:nlsxbe(ファイル名または拡張子が長すぎます。java.lang.UnsatisfiedLinkError:nlsxbe(ファイル名または拡張子が長すぎます。)at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:952)atjava。 lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:921)at java.lang.System.loadLibrary(System.java:452)at lotus.domino.NotesThread.load(Unknown Source)at lotus.domino.NotesThread.checkLoaded(Unknown Source )at lotus.domino.NotesThread.sinitThread(Unknown Source)at com.atempo.adam.lotus.plugin.views.TopicView.createPartControl(TopicView.java:609)
NotesFactoryはNotes.jarにあり、依存関係タブの「plugin.xml」に含まれています。(依存関係は「com.ibm.notes.java.api」です)。
jarへのパスは次のとおりです。"C:\ Archivos de programa \ IBM \ Lotus \ Notes \ framework \ rcp \ eclipse \ plugins \ com.ibm.rcp.j2se.win32.x86_1.5.0.SR4-200707311521 \ jre \ lib \Notes.jar"これは128文字より長いです。「C:\ Archivosde programa \ IBM」ではなく「c:\ programfiles \ IBM」にメモをインストールすると、結果のパスは128より短くなり、エラーは発生しません。
また、zippy32コマンドを使用してnlsxbe.dllをWIN \System32またはregistringnlsxbe.dllにコピーしようとしましたが、同じエラーが発生します。
バージョンは次のとおりです。Lotusnotes8.0、リビジョン20070803.1143 java 1.5.0
ありがとう
java - JNI を使用して Java コードから文字列の値を取得するためのメモリ リーク
GetStringUTFChars を使用して、JNI を使用して Java コードから文字列の値を取得し、ReleaseStringUTFChars を使用して文字列を解放しています。コードが JRE 1.4 で実行されている場合、メモリ リークはありませんが、同じコードが JRE 1.5 以降のバージョンで実行されている場合、メモリが増加します。これはコードの一部です
リークの理由がわかりません。誰か助けてくれますか?
これは、コードの残りの部分をコメントし、この部分を残すと、メモリ リークが発生するためです。これは私が使用しているコードの一部です
上記の ///// の間のセクションにコメントすると、メモリ リークは見られません。
java - 組み込み Java ネイティブ メソッドの呼び出し
JVM の組み込みネイティブ コード、つまり java.lang および java.io のさまざまなクラスが呼び出すコードを呼び出すことは可能ですか? つまり、組み込みの Java API をバイパスして、ファイル システム アクセスなどのさまざまなシステム レベルの呼び出しにアクセスできますか? 独自のネイティブ コード ライブラリを構築し、それを JNI 経由で呼び出すことでこれを実行できることはわかっていますが、JVM に既に組み込まれている機能のために追加のネイティブ ライブラリを必要としない方が賢明です。
java - 任意のCコードを使用したJavaNativeInterface
提供された.dllがあり、Javaを使用してインターフェースする必要があります。
jni.hで提供されているJNIタイプを使用するには、Cを書き直す必要がありますか?javasunのjniの例に見られるように。それ以外の場合、Java関数がポインターを送受信するようにネイティブ関数を宣言するにはどうすればよいですか?
ありがとう