問題タブ [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 - Cプロセス内からJavaを起動する方法は?
Java (実際にはClojure ) ベースのイベント ハンドラーを巨大なレガシー C アプリケーションに追加したいと考えています。これを行うための最も簡単で簡単に維持できる方法は何ですか? Java クラスを C コードと同じプロセスで実行したいと考えています。これは可能ですか?
java - JNIを使用してJavaからC++のSTLライブラリを呼び出す方法はありますか?
JNIからSTLライブラリを呼び出す方法はありますか?JNIはネイティブコールにCのようなインターフェイスを提供すると思いますが、C ++テンプレートライブラリでこれをどのように実現しますか?
java - JNI vs Runtime.exec()
2 つのオプションがあります。JNI を使用するか、Runtime.exec を使用して C++ ライブラリを実行できます。
C++ プログラムは CPU を集中的に使用し、実行に時間がかかります。つまり、一部の呼び出しが戻るまでに最大 2 時間かかる場合があります。
それぞれの長所と短所は何ですか?どのアプローチを採用する必要がありますか?
java - Java: jni 呼び出しでのネイティブ コードのエラーは、通常どのように処理されますか?
私は少しグーグルで検索しましたが、私の質問に対する適切な答えが実際には見つかりませんでした: ネイティブの jni コードから Java にエラー情報を返す慣習的な方法は何ですか?
私は通常、デザインを選んでそれを使用しますが、このコードは 5 ミリ秒ごとに (約) 呼び出されるため、これを行うための慣習的な「クリーンで効率的な」方法があるかどうかを尋ねたいと思いました。
私の見方では、次の 4 つの明白なオプションがあります。
呼び出しごとに、java で「エラー リターン」オブジェクトを作成し、それを JNI に渡します。問題がある場合、ネイティブ コードはこのオブジェクトにエラーの説明を入力し、Java コードは戻り時にそれをチェックします。エラーは一般的なケースではないため、GC がクリーンアップするために多くのオブジェクトが作成され、それらの 99.99% は不要です。
#1 と同様に、Java クラスに単一の「エラー リターン」オブジェクトを作成し、各メソッド呼び出しに何度も渡されます。エラーが返されるたびに Java コードで確認してください。これは私には危険に思えますが、おそらくそれは適切なオプションですか?
該当する場合は、エラーの説明を含むオブジェクトをネイティブ コードで作成し、それを戻り値として Java に返します。Java で呼び出した後、null の戻りを確認します。これは#1よりも無駄がないように見えますが、少しぎこちないようです。
jni メソッドで整数の戻り値を作成し、ネイティブ コードの「終了」値に対応する int を返すだけです。Java マップで考えられるすべてのネイティブ終了状態を列挙します。戻り値を '0' と比較し、必要に応じてこのマップでエラーを調べます。これは他の方法よりも効率的に見えますが、ネイティブ コードを変更すると誰かが戻って「エラー テーブル」を更新する必要があるため、扱いにくいように見えます。
明らかな何かが欠けているように感じます...洞察を提供できるグルがそこにいますか?
ありがとう!
c++ - JNIとC++オブジェクトインスタンス
私はちょうど新しい仕事を始めました。ここでは、JNI(C ++ / Javaのブリッジング用)を初めて使用します。私はJNIを初めて使用するので、私の許しを許してください:)
(win32)Javaアプリでは、C++DLLをロードしています。Java側には、「SomeJClass」のインスタンスがいくつかあります。これらの各インスタンスは、DLL側の「SomeCClass」の対応するインスタンスにアクセスする必要があります。DLLは、GlobalDoSomethingInC()などのエントリポイントを公開します。ここでは、Doer :: DoSomethingInC()のインスタンスメソッドを呼び出す必要があります。したがって、それぞれのthis-pointersをマップするためのスムーズな方法が必要です。また、DLLスレッドが、対応するJavaインスタンスに通知する必要がある興味深いものを検出したときにも同じマッピングを行う必要があります。
私はいくつかの解決策を考えることができますが、私はそれらをあまり好きではありません。私の質問は、これよりも良い方法はありますか?
1 JavaはC:GetNewInstance()を呼び出します。これは、実際には新しいCインスタンスへのポインタであるintを返します。Javaはそれをm_myCInstanceに格納します。次に、JavaはGlobalDoSomethingInC()を呼び出し、1a
1bまたは:
2 CからJavaに呼び出す場合、状況はおそらく良く見えます
悪くないと思います。しかし、jobject参照を保存することは本当に安全です。 つまり、GCがオブジェクトを移動するとどうなりますか?
3現在のソリューションは「機能」します。しかし、それはむしろhttp://www.codinghorror.com/blog/に属しています:)
ありがとう
java - JNI 経由での JVM のロードに失敗したときにエラー メッセージを表示するにはどうすればよいですか?
jvm のロードに失敗した理由を説明するエラー メッセージを取得したいと考えています。ここに提供されている例から:
http://java.sun.com/docs/books/jni/html/invoke.html
この例を抽出しました:
私の特定のケースでは、vm_args に無効な引数を指定しており、コマンド ラインで「認識されないオプション: -foo=bar」と表示されることを期待しています。
さらにテストすると、jvm がメッセージ I want to stdout または stderr を出力しているように見えます。探しているエラーを取得するには、stdout と stderr をキャプチャする必要があると思います (もちろん、もっと簡単な方法がない限り)。私はC++でコーディングしているので、誰かがエラーを文字列ストリームにキャプチャする方法を示すことができれば理想的です。
ありがとう、ランディ
java - アプリにフォーカスがないJavaのイベントリスナー?(グローバルキー押下検出)
私はしばらく探していましたが、Javaだけではこれは不可能だと誰もが思っているようですので、SOを試してみます;)
別の無関係なアプリケーションがウィンドウフォーカスを持っている間に、Javaアプリケーションにイベント(特に重要なイベント)をリッスンさせる方法はありますか?私の状況では、Javaアプリケーションにフォーカスがない場合でも、ユーザーがキーボードの「一時停止」キーを押したことを検出しようとしています。
いくつかのCコードを記述してJNIを使用するのが唯一の方法であると言う人がいると聞きました。誰かがそれを回避する方法を知っているかどうかだけ興味がありますか?または、そうでない場合は、少なくともc / JNIに関する本当に素晴らしいチュートリアルですか?
ありがとう
java - NewStringUTFに渡されたchar*をクリーンアップする必要がありますか?
はいと思いますが、私が見つけた上位12の例はすべて、次のような説明的ではないことを行っています。
後世のために私は尋ねます:これは悪いですよね?
...そしてあるべきです:
java - JNI Cコードを介してPNG画像をBufferedImageとしてJavaにロードします
次の問題があります。PNG画像を基本的に生データとして取得し、メモリに保持するCコードがあります。JNI を使用して、この生データを Java の BufferedImage に変換したいと考えています。誰かがこれを行う方法を知っているか、以前にこれを行ったことがありますか?