9

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

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


編集

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

皆様、ご協力ありがとうございました。提案された解決策はすべて興味深いものでした。より大きなライブラリにリンクする必要がある場合は、それらを検討します。C コードの小さな部分については、手作業による変換が最も簡単な解決策でした。

4

7 に答える 7

11

Java GNU Scientific Libraryプロジェクトでは、Swig を使用しC ライブラリの JNI ラッパー クラスを生成しました。優れたツールであり、Python を含むいくつかの言語でラッパー コードを生成することもできます。強くお勧めします。

于 2008-09-17T13:43:54.713 に答える
5

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

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

あなた自身がコメントしているように、JNI の方法は可能です。ac コンパイラに関しては、おそらく 'Bloodshead Dev-c++' を使用できるかもしれませんが、5000 行までは大変な作業です。

于 2008-09-17T13:42:52.233 に答える
4

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

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

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

于 2008-09-17T13:43:14.933 に答える
1

たとえそれが小さいとしても、C ライブラリを使用したいですか?

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

C ライブラリが単純な場合は、C ライブラリを純粋な Java に移植するだけで、JNI ライブラリ、C ライブラリ、および Java コードの構築/デプロイを処理する必要がない方が簡単な場合があります。

于 2008-09-17T16:54:13.757 に答える
0

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

于 2008-09-17T13:48:51.003 に答える
0

さて、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 を使用しても何も得られませんが、遅くなりますアプリをダウンさせ、メモリ オーバーヘッドを引き起こします。

于 2008-09-17T13:54:14.703 に答える
-2

使用してみましたか:

System.loadLibrary("mylibrary.dll");

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

于 2008-09-17T13:46:39.167 に答える