2010-12-01 12 views
7

私はCの構造を持っています。JavaとCの間でデータを渡す

struct data{ 
    double value1[50]; 
    double value2[50]; 
    int count; 
}; 

JavaのデータをこのC構造にマップしたいと思います.JNIを使​​用してどのように行うことができますか? Javaコードは私によってプログラムされません。 Javaプログラマは、どのフォームでデータを送信する必要があるかを知りたいだけですか?彼はさらに詳細を期待する必要があります

私は現在、2つの列を含むCSVファイルで構造体インスタンスを埋めてコードをテストしています。

また、私のCコードからJavaアプリケーションに3つのdouble値を返したいとします。

+1

Java側では、JNAはJNIよりも使いやすい別のオプションです。たぶんそれはCコミュニケーションをより簡単にするでしょう。 https://jna.dev.java.net/ – mjn

答えて

2

は、Javaプログラマに次の宣言を提供します:あなたのCコードで

public native double[] doData(double [] value1, double [] value2, int count); 

を使用すると、渡されたパラメータと構造を埋めることができるようになります。 JNIヘッダーは次のようになります。

JNIEXPORT jdoubleArray JNICALL Java_package_className_doData(JNIEnv * , jobject, jdoubleArray , jdoubleArray, jint); 
+0

cool!私はどのように私のJavaコードに3倍の値を返すのですか?もちろん戻り値として言及されたdouble配列の –

+1

です。 –

1

CSVなどの標準データコンテナを使用することはまったく適切です。無料のJava CSVエンコーディングライブラリがたくさんあります。

あなたのJavaプログラマはネイティブのJavaデータ構造を使用できますが、必要なのはCSV(またはXMLなどの他の形式)あなたに送ってください。

最後に、いくつかのCSVライブラリを使用してこのデータコンテナを読んでください。

+1

階層的なデータがあればJSONを検討する価値があると思います。もちろん、構造体の形でJNA/JNIを使​​ってJavaとCの間でデータを運ぶ方が速いかもしれません... – Darien

2

さまざまなプログラムからデータを受け取るためにCSV形式に問題はありませんが、XMLを使用してデータを取得しようとしています。その一部は、データ形式の主観的な好みです。 XMLを使用すると、プログラムを読み込む前に検証できる堅牢な構文を定義できます。そしてIMHOでは、適切なXMLデザインがデバッグの目的のためにはるかに読みやすくなっています。

+0

なぜこれが投票されましたか?私はポストに何が間違っているのか見当たりません。 – Jay

3

は、Java側で「構造体」の同じ種類を使用したい場合(JavaとCの開発者が同じことについて話すことができるように)私は、その構造体に対応するクラスを作成します。

class JavaData { 
    double value1[50]; 
    double value2[50]; 
    int count; 
}; 

次に、JNIに入るときにJavaワールドから値をコピーする必要があります。これは、あなたがそれを行う方法の例です:

// get the class 
jclass javaDataClass = env->FindClass("JavaData"); 

// get the field id 
jfieldID countField = env->GetFieldID(javaDataClass, "count", "I"); 

// get the data from the field 
cData.count = env->GetIntField(jData, countField); 

... (the rest of the parameters) 
2

おそらく、これはJNIで動作するように得ることができますが、個人的に、私はむしろ、JNIとの仕事よりも私の目で立ち往生ホット針を持っていると思います。私は個人的にはJavaネイティブアクセス(JNA)がであり、多くはであることがわかります。

関連する問題