質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3083閲覧

JNAを利用してjavaとCのやりとりを行う方法

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/10/13 11:14

JNAを利用してjavaプログラムとCプログラムのやりとりを行いたいのですが,方法がわからず困っています.
自分でも調べましたが,よく理解できず,困っています.

やりたいことは,javaで取得した数値の配列をCで作成したプログラムに渡し,C内で処理した結果(文字列)をjavaプログラムに返し,java内で利用したいです.
プログラムの内容は,取得した数値の配列を1つずつ16進数文字列に変換し,変換した16進数文字列を末尾に足していき1つの文字列にしています.

例)
int i[]= {10,12}をchar x = 0a,char y = 0cにそれぞれ変換,それをつなげて0a0cという文字列として完成させる(C内での記述).

わからないことは
・どのようにしてjavaで取得した数値配列をCに渡すのか
・どのようにしてCで処理した文字列をjavaに返すのか
・JNAを利用する際,Cはgccでのコンパイルで共有ライブラリにすると利用ができる,という認識は正しいのか
・そもそもJNAを利用すればやりたいことは実現可能なのか
の4点がわかりません.

どれか1つでも教えていただけると嬉しいです.また,参考になるようなサイトがあれば教えていただきたいです.
質問がたくさんあり申し訳ありません.よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

自分も少しやってみたので、わかる範囲でお答えします。
(誤りなどありましたら指摘いただけると嬉しいです)

・どのようにしてjavaで取得した数値配列をCに渡すのか

java側のint[]という配列をCへ渡す際にはCの関数宣言を
... function_name(int* ia, int length)
... function_name(int ia[], int length) (Cでは上の定義と同等です)
のようにしてやればよいと思います。Java側で用意するメソッド(com.sun.jna.Libraryを継承したinterface上のメソッド) は次のようになります。
... function_name(int[] ia, int length)
ちなみに、lengthは配列の長さを渡すための引数です。

・どのようにしてCで処理した文字列をjavaに返すのか

これは少々難しく感じます。最も簡単なのは、Cの関数の戻り値をconst char*にし、Java側で用意するメソッドの戻り値の型をStringとする方法と思います。しかしながらこの素朴な方法には落とし穴があります。例えばスレッドセーフへの配慮です。Cの関数をスレッドセーフにする簡単な方法は、戻り値の領域を引数で与えるか(A)、または関数内でmallocする(B)ことですが、(A)はJNAをつっこんで学ぶ必要があり、(B)はJNAでは多分NGと思います(なぜならだれもfreeしてくれないから)。グローバル変数としてバッファーを用意し、バッファーの先頭アドレスを返すなら簡単ですが、そういう関数はスレッドセーフでないので、Java側で複数スレッドからの同時実行をガードする必要があります。

本件のベストな解を得るにはJNA本家の説明を熟読した方がよさそうです。

・JNAを利用する際,Cはgccでのコンパイルで共有ライブラリにすると利用ができる,という認識は正しいのか

・そもそもJNAを利用すればやりたいことは実現可能なのか

どちらもYESと思います。

ただ「文字列を返す」ところで述べたように、簡単に作れるケースとそうでないケースがありそうです。intなど単純な型のみならJNAのデフォルトの型マッピングのみで簡単に作れますが、ポインター、独自の型等々、少し複雑なインターフェースではJNAの仕様をよく調べてJava側にそれなりの配慮が必要です。

なお、JNAではLinux, Windows, Macintoshの代表的なシステム提供ライブラリー接続用のインターフェースクラスが最初から提供されているようで、これを使う分にはかなり簡単だと思います。cateyeさん回答コードはこの「既に存在するDLL内部の処理ルーチンをJavaから簡単に呼び出す」というJNAの便利さが最もよくあらわれている例ではないでしょうか。


余談:

ちなみに、自前でCによるDLLを始めて作るならこちらも苦労されるかも知れません。自分はEclipse CDTではちゃんと作れませんでした。Linuxでやると割合簡単につくれたのでWindowsは初心者にとってちょっと難易度高めかも知れません。

投稿2017/10/15 09:12

編集2017/10/15 09:55
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/15 09:37

丁寧な回答をありがとうございます.かなり行き詰まっていたので,大変嬉しく思います. 私はプログラミング初心者のため,大変申し訳ありませんが,少し質問させてください.Cのインターフェイスというのがよくわかりません.教えていただいた記述は,どのように利用すればよいのでしょうか…? CのDLLに関してですが,Windowsでは難しいとお聞きし少し怖気付いています….Windowsで難しいのであれば,MacもしくはLinuxでDLLを作成し,それをWindowsに持って行くという方法は可能でしょうか? 回答頂いたのに再度たくさん質問してしまい大変申し訳ありません.詳しい回答,本当にありがとうございました.
KSwordOfHaste

2017/10/15 10:00 編集

> Cのインターフェース 「Cの関数宣言に」に書き直してみました。インターフェースはプログラミングでの一般用語ですが、この場合は「引数の型や順番、戻り値の型」といった意味合いです。 > どのように利用すればよいのでしょうか…? Cで関数を実装するときの宣言と用いると考えてください。 > Windowsに持って行く クロスプラットフォームでのプログラミング開発という手法になるかと思いますが・・・通常はWindows上でWindows用のDLLを作るよりさらに難易度が上がります。Linxuだと簡単といったのは「Linux上でLinux専用のshared libraryを作るのが簡単」という意味です。
退会済みユーザー

退会済みユーザー

2017/10/15 12:20

なるほど,詳しい説明をありがとうございます!関数宣言時に利用するということでしたか,理解力が足りず申し訳ありません.本当にありがとうございます.DLLですが,自身でWindows上での作成方法を調べてみようと思います.また行き詰まったら質問するかと思いますが,よろしければまたご助力いただけると嬉しいです.今回は本当にありがとうございました.
guest

0

参考までに・・・JNIより簡単にJavaとC/C++をつなぐ「JNA」とは とか、Java Native Access
ここから追加ー>ちょっと時間があったので、テストしてみました。
netbeans
wikiサンプルPOSIX環境です。ディレクトリもちゃんと作成できました。
こちらの環境
FreeBSD usr.cateye.jp 11.1-RELEASE-p1
openjdk8-8.144.1
netbeans-8.1

投稿2017/10/13 20:32

編集2017/10/14 04:38
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/10/14 03:02

回答ありがとうございます.やはりそのサイトが一番良いようですね….もう一度読み込もうと思います.URLありがとうございます!
退会済みユーザー

退会済みユーザー

2017/10/14 04:56

追記ありがとうございます.わざわざコードを作成していただき動作確認を行っていただきありがとうございます.自分がプログラミング初心者のため,何をしているか漠然とでもわかるのに時間がかかると思いますので,現状でお返事させて頂きました.本当にありがとうございます.いただいたURLとサンプルコードを読み込み,理解できるよう努力します.またわからないことがあれば質問すると思いますが,その時はよろしくお願いいたします.
退会済みユーザー

退会済みユーザー

2017/10/14 05:01

追記忘れていました.私の環境はWindowsになります.POSIX環境をよく理解できていませんが,いただいたコードはWindowsでは動作しないのではないかと考えています.ただ,コードを頂けてとても助かりました.URLの内容を読む限り,やりたいことは実現できそうなのでもう少し頑張ってみます.本当にありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問