Java アプリケーションで C ソース コードを使用する最も簡単な方法は何ですか?

StackOverflow https://stackoverflow.com/questions/83299

  •  01-07-2019
  •  | 
  •  

質問

Java アプリケーションで使用したいこのオープンソース ライブラリを見つけました。このライブラリは C で書かれており、Unix/Linux で開発されており、私のアプリケーションは Windows 上で実行できます。これは主に数学関数のライブラリなので、私の知る限り、プラットフォームに依存するものは何も使用しておらず、非常に基本的な C コードだけです。また、行数は 5,000 行未満とそれほど大きくありません。

アプリケーションでライブラリを使用する最も簡単な方法は何ですか?JNI があることは知っていますが、それには、Windows 上でライブラリをコンパイルするためのコンパイラを見つけたり、JNI フレームワークを最新の状態にしたり、コードを書いたりする必要があります。実行可能ですが、それほど簡単ではありません。もっと簡単な方法はありますか?ライブラリのサイズが小さいことを考えると、それを Java に翻訳するだけの誘惑に駆られます。それを助けるツールはありますか?


編集

結局、ライブラリの必要な部分を Java に翻訳することになりました。現時点ではライブラリの約 10% ですが、時間の経過とともに増加する可能性があります。C と Java はかなり似ているので、数時間しかかかりませんでした。主な困難は、翻訳の間違いによって生じたバグを修正することです。

皆さん、ご協力ありがとうございました。提案された解決策はどれも興味深いと思われたので、より大きなライブラリにリンクする必要があるときに検討してみます。小さな C コードの場合、手動翻訳が最も簡単な解決策でした。

役に立ちましたか?

解決

最善の策は、おそらく良い本を手に入れることです (K&R:C プログラミング言語) お茶を一杯飲んで翻訳を始めましょう!私は翻訳プログラムを信頼するかどうか懐疑的です。最良の翻訳者はあなた自身ではないことがほとんどです。これを実行すれば完了なので、再度実行する必要はありません。ライブラリがオープンソースの場合、いくつかの複雑な問題が発生する可能性があります。これについてはライセンスを注意深く確認する必要があります。考慮すべきもう 1 つの点は、翻訳には常に何らかのリスク要素と潜在的なエラーが存在するため、翻訳が正しいことを確認するためにいくつかのテストを作成することを検討する必要があるかもしれないということです。

JAVA に相当する Math 関数はありませんか?

あなた自身がコメントしているように、JNI の方法は可能です。C コンパイラの場合は、おそらく「Bloodshead Dev-c++」を使用すると機能するかもしれませんが、約 5000 行の場合は多大な労力がかかります。

他のヒント

Java GNU 科学ライブラリ 私が使用したプロジェクト スウィッグ C ライブラリの周囲に JNI ラッパー クラスを生成します。優れたツールで、Python を含むいくつかの言語でラッパー コードを生成することもできます。強くお勧めします。

それをコンパイルして JNA を使用します。

JNA (Java Native Access) は基本的に、コンパイル時の JNI と同じことを実行時に実行し、非 Java コード (Java もあまり必要ありません) を必要としません。

あなたの場合のパフォーマンスや使いやすさについてはわかりませんが、試してみたいと思います。

たとえそれほど小さいものであっても、C ライブラリを使用してもよろしいですか?

64 ビットがもう少し一般的になると、ライブラリの 32 ビット バージョンと 64 ビット バージョンの両方の構築/展開も開始する必要があります。また、C コードがどのようなものであるかによって、64 ビットとしてビルドするためにコードを更新する必要がある場合とそうでない場合があります。

C ライブラリが単純な場合は、C ライブラリを純粋な Java に移植するだけで済み、JNI ライブラリ、C ライブラリ、および Java コードの構築/デプロイに取り組む必要がなくなる可能性があります。

さて、AMPCがあります。これは Windows、MacOS X、Linux 用の C コンパイラで、C コードを Java バイト コード (Java 仮想マシン上で実行されるコードの一種) にコンパイルできます。

AMPC

ただし、これは商用であり、ライセンスごとに 199 ドルかかります。それがあなたにとって有益であるとは思えません ;) そのような無料のコンパイラを私は知りません。

OTOH、Java、C はかなり似ています。おそらく C コードを Java にリファクタリングすることができ (構造体をパブリック インスタンス変数を持つオブジェクトに置き換えることができます)、ポインター操作は通常、他のもの (配列操作など) に変換できます。とはいえ、5,000 行ものコードを書きたくないでしょう?

JNI を使用するとコードはプラットフォームに依存しますが、プラットフォームに依存しない C であると言うのであれば、Java コードをプラットフォームに依存する理由はありません。OTOH では、これらの計算のコストに応じて、JNI を使用すると実際にパフォーマンスが向上する可能性があります。生の数値処理のスループットに関しては、速度では C が依然として Java に勝てるからです。ただし、JNI 呼び出しは非常にコストがかかるため、計算が非常に単純で迅速な計算である場合、JNI 呼び出し自体は実行される計算と同じくらい (またはそれ以上) かかる可能性があり、その場合、JNI を使用しても速度が低下するだけで何も得られません。アプリがダウンし、メモリのオーバーヘッドが発生します。

確かに、JNA は印象的で、JNI を直接使用するよりも労力が少なくて済みます。ただし、いずれの場合もプラットフォームの独立性は失われ、おそらくプラットフォームのほんの一部しか使用していないため、実際に必要なものを翻訳することを検討するかもしれません。

使用してみましたか:

System.loadLibrary("mylibrary.dll");

これが純粋な C ライブラリで機能するかどうかはわかりませんが、おそらく試してみる価値はあります。:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top