teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

やりたいことをJavaアプリからC言語の関数をコールする方法のみに変更させていただきました。\(理由は本文中に記載します\)

2016/08/08 01:50

投稿

dashi
dashi

スコア14

title CHANGED
File without changes
body CHANGED
@@ -1,115 +1,107 @@
1
- <開発環境>
1
+ >matobaaさん
2
- Windows7 64bit
3
- C言語のビルド環境:gcc
4
- Java言語のビルド・実行環境:Eclipse(Mars)
5
- JDK 1.7.0_79(32bit)
2
+ 反応いただきありがとうございます。
6
- ※最初はjdk1.8.0_101(64bit)で実行していましたが、以下の記事を参考に32bitのJDKも構築した次第です。
7
- http://d.hatena.ne.jp/nowokay/20120618
8
3
 
4
+ >ソース部分はコードタグで囲んでください。
9
- JNA:jna-4.2.2.jarEclibseから読み込んでい
5
+ 初めて投稿したためにコードタグ入れるのを失念しておりした
6
+ 見難い記述をしてしまい誠に申し訳ございません。
10
7
 
11
- <前提>
12
- 以下の手順て、hoge.exe作成し、
8
+ >gccはなに使っていますか?
13
- コマンドプロンプトからhoge.exeを実行している状態です。
9
+ minGWとなります。
14
10
 
11
+
12
+ 前回、「やりたいこと」ととして記載した内容はよくよく考えると、
15
- >gcc -c hello.c
13
+ プロセスを跨いでいるため、プロセス間通信が必要となり、
16
- >gcc -c test.c
14
+ 単純にJavaアプリからの関数コールでは実現できないのではないかと思いました。
17
- >gcc -o hoge hello.o test.o
15
+ >C言語で書いたhoge.exe(以下のプログラム)を実行中に、test.c内のsetTest()を
18
- >gcc -shared -o libtest.dll test.c ★Javaアプリから呼び出すために共有ライブラリ作成
16
+ >Javaアプリから呼び出し、main関数内で出力されるログ切り分けたいです。
19
17
 
20
- >hoge.exe ←★実行 getTest()で取得される値監視
18
+ よって、JavaアプリからJNA使用してC言語の関数を呼び出す方法のみの質問に変更させてください。
19
+ お手数をおかけして申し訳ございません。
21
20
 
21
+ <質問事項見直し>
22
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22
- <やりたいこと>
23
+ <開発環境>
24
+ Windows7 64bit
23
- C言語で書いたhoge.exe(以下プログラム)を実行中に、test.c内のsetTest()
25
+ C言語のビルド環境:gcc (minGW)
24
- Javaアプリから呼び出し、main関数内で出力されるログを切り分けたいです。
26
+ Java言語のビルド・実行環境:Eclipse(Mars)
27
+ JDK 1.7.0_79(32bit)
28
+ ※最初はjdk1.8.0_101(64bit)で実行していましたが、以下の記事を参考に32bitのJDKも構築した次第です。
29
+ http://d.hatena.ne.jp/nowokay/20120618
25
30
 
26
- ※C言語のソース
27
- ■hello.c
28
- #include <stdio.h>
29
- int main(int a, char** c){
30
- int flg=0;
31
- while(1){
32
- flg = getTest();
33
-
34
- if(0==flg){
35
- printf("hello World: 01\n");
31
+ JNA:jna-4.2.2.jarをEclibseから読み込んでいます。
36
- }
37
- else{
38
- setTest(0);
39
- printf("hello Workd: 02\n");
40
- }
41
- }
42
- return 0;
43
- }
44
- ■test.c
45
- #include <stdio.h>
46
- int testFlg=0;
47
- int getTest(){
48
- return testFlg;
49
- }
50
- void setTest(int a){
51
- testFlg = a;
52
- }
53
32
 
54
- ※Javaアプリケーション側のソース
33
+ <前提>
55
- public class jw_test extends JFrame implements SerialPortEventListener{
56
- public interface CLibrary extends Library{
57
- CLibrary INSTANCE = (CLibrary)Native.loadLibrary("libtest.dll", CLibrary.class);
34
+ 以下の手順で"test.dll"を作成し、本dllをJavaアプリ内の「Native.loadLibrary」の引数に
58
- void setTest(int a);
35
+ 指定しています。
59
- }
60
- public static void main(String[] args) {
36
+ ・C:\MinGW>gcc -shared -o test.dll test.c
61
- EventQueue.invokeLater(new Runnable() {
62
- public void run() {
63
- try {
64
- jw_test frame = new jw_test();
65
- frame.setVisible(true);
66
- } catch (Exception e) {
67
- e.printStackTrace();
68
- }
69
- }
70
- });
71
- }
72
- public jw_test() {
73
- MainForm = this;
74
37
 
75
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
76
- setBounds(100, 100, 450, 589);
77
- contentPane = new JPanel();
38
+ <やりたいこと>
78
- contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
39
+ JavaアプリからJNAを使用してC言語の関数(test.c内のtest_Printf())をコールしたい。
79
- setContentPane(contentPane);
80
- contentPane.setLayout(null);
81
40
 
82
- btnPortClose = new JButton("Port Close");
41
+ <質問事項>
83
- btnPortClose.addActionListener(new ActionListener() {
42
+ Javaアプリ上に配置した「Port Closeボタン」を押下するとExceptionが発生します。(ソースコード内の(★))
43
+ eclipse上のエラーログを見ると、test.dllが32bitでビルドされていない旨の指摘に見えますが、
84
- public void actionPerformed(ActionEvent e) {
44
+ 以下の記事を参考にtest.dllが32bitでビルドされていることは確認しています。
85
- textArea.setText("Port Close Clicked");
45
+ ※test.dllのバイナリデータを確認すると、「0x504500004C01」となっていること
86
- if(commPort != null){
87
- commPort.close();
88
- }
89
- CLibrary.INSTANCE.setTest(1); ★アプリ上のCloseボタン押下でtest.c内の関数を呼び出したい
46
+ http://sow23.blog.fc2.com/blog-entry-19.html
90
- }
91
- });
92
- }
93
- }
94
47
 
48
+ また、Javaアプリケーションも以下の記事を参考に32bitのJDKでビルドしています。
49
+ http://www.searchman.info/java_eclipse/1070.html
95
50
 
96
- <質問事項>
97
- Closeボタンを押下すると以下のエラーが発生しております。
98
- ただし、libtest.dllやhoge.exeは32bitで動作していることは以下の記事を参考に確認しています。
99
- http://sow23.blog.fc2.com/blog-entry-19.html
100
51
 
52
+ その他の原因としてどのようなことが想定されますでしょうか?
101
- Javaアプリケーションは、以下の記事を参考に32bitのJDKでビルドしてます。
53
+ 継続して調査を行っておりますが、現状行き詰っている状態です
102
- http://www.searchman.info/java_eclipse/1070.html
54
+ 些細なアドバイスでもいただけますと助かります。
103
55
 
56
+ <ソースコード>
57
+ ```C言語
58
+ #include <stdio.h>
59
+ void test_Printf(){
60
+ printf("hello World:test_Printf()\n");
61
+ }
104
- ★★
62
+ ```
105
- ★★
63
+ ```Java言語
64
+ public class jw_test extends JFrame implements SerialPortEventListener{
106
- ★Javaアプリケーションが32bitでビルドされていないということでしょうか?
65
+ public interface CLibrary extends Library{
66
+ CLibrary INSTANCE = (CLibrary)Native.loadLibrary("test.dll", CLibrary.class);
107
- ★回避策はございますでしょうか。
67
+ void test_Printf();
68
+ }
69
+ public static void main(String[] args) {
108
- ★しばらくgoogleで検索しましたが、現状解決の糸口すら見えていない状況です。
70
+ EventQueue.invokeLater(new Runnable() {
71
+ public void run() {
72
+ try {
73
+ jw_test frame = new jw_test();
74
+ frame.setVisible(true);
75
+ } catch (Exception e) {
76
+ e.printStackTrace();
77
+ }
78
+ }
109
- ★★
79
+ });
110
- ★★
80
+ }
81
+ public jw_test() {
82
+ MainForm = this;
111
83
 
84
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
85
+ setBounds(100, 100, 450, 589);
86
+ contentPane = new JPanel();
87
+ contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
88
+ setContentPane(contentPane);
89
+ contentPane.setLayout(null);
90
+
91
+ btnPortClose = new JButton("Port Close");
92
+ btnPortClose.addActionListener(new ActionListener() {
93
+ public void actionPerformed(ActionEvent e) {
94
+ textArea.setText("Port Close Clicked");
95
+ if(commPort != null){
96
+ commPort.close();
97
+ }
98
+ CLibrary.INSTANCE.test_Printf(); ★アプリ上のCloseボタン押下でtest.c内の関数を呼び出したい
99
+ }
100
+ });
101
+ }
102
+ }
103
+ ```
112
- エラーメッセージ
104
+ <エラーログ>
113
105
  Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: %1 は有効な Win32 アプリケーションではありません。
114
106
 
115
107
  at com.sun.jna.Native.open(Native Method)
@@ -119,7 +111,7 @@
119
111
  at com.sun.jna.Native.loadLibrary(Native.java:502)
120
112
  at com.sun.jna.Native.loadLibrary(Native.java:481)
121
113
  at jw_estorq$CLibrary.<clinit>(jw_estorq.java:65)
122
- at jw_estorq$3.actionPerformed(jw_estorq.java:150)
114
+ at jw_estorq$3.actionPerformed(jw_estorq.java:151)
123
115
  at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
124
116
  at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
125
117
  at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
@@ -157,4 +149,4 @@
157
149
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
158
150
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
159
151
 
160
- 以上、よろしくお願いいたします。
152
+ 以上す。