質問編集履歴
1
やりたいことをJavaアプリからC言語の関数をコールする方法のみに変更させていただきました。\(理由は本文中に記載します\)
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
|
-
|
2
|
+
反応いただきありがとうございます。
|
6
|
-
※最初はjdk1.8.0_101(64bit)で実行していましたが、以下の記事を参考に32bitのJDKも構築した次第です。
|
7
|
-
http://d.hatena.ne.jp/nowokay/20120618
|
8
3
|
|
4
|
+
>ソース部分はコードタグで囲んでください。
|
9
|
-
|
5
|
+
初めて投稿したためにコードタグを入れるのを失念しておりました。
|
6
|
+
見難い記述をしてしまい誠に申し訳ございません。
|
10
7
|
|
11
|
-
<前提>
|
12
|
-
|
8
|
+
>gccにはなにを使っていますか?
|
13
|
-
|
9
|
+
minGWとなります。
|
14
10
|
|
11
|
+
※
|
12
|
+
前回、「やりたいこと」ととして記載した内容はよくよく考えると、
|
15
|
-
|
13
|
+
プロセスを跨いでいるため、プロセス間通信が必要となり、
|
16
|
-
|
14
|
+
単純にJavaアプリからの関数コールでは実現できないのではないかと思いました。
|
17
|
-
|
15
|
+
>C言語で書いたhoge.exe(以下のプログラム)を実行中に、test.c内のsetTest()を
|
18
|
-
|
16
|
+
>Javaアプリから呼び出し、main関数内で出力されるログを切り分けたいです。
|
19
17
|
|
20
|
-
|
18
|
+
よって、JavaアプリからJNAを使用してC言語の関数を呼び出す方法のみの質問に変更させてください。
|
19
|
+
お手数をおかけして申し訳ございません。
|
21
20
|
|
21
|
+
<質問事項見直し>
|
22
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
22
|
-
<
|
23
|
+
<開発環境>
|
24
|
+
Windows7 64bit
|
23
|
-
C言語
|
25
|
+
C言語のビルド環境:gcc (minGW)
|
24
|
-
Java
|
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
|
-
|
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
|
-
|
33
|
+
<前提>
|
55
|
-
public class jw_test extends JFrame implements SerialPortEventListener{
|
56
|
-
public interface CLibrary extends Library{
|
57
|
-
|
34
|
+
以下の手順で"test.dll"を作成し、本dllをJavaアプリ内の「Native.loadLibrary」の引数に
|
58
|
-
|
35
|
+
指定しています。
|
59
|
-
}
|
60
|
-
|
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
|
-
|
38
|
+
<やりたいこと>
|
78
|
-
|
39
|
+
JavaアプリからJNAを使用してC言語の関数(test.c内のtest_Printf())をコールしたい。
|
79
|
-
setContentPane(contentPane);
|
80
|
-
contentPane.setLayout(null);
|
81
40
|
|
82
|
-
|
41
|
+
<質問事項>
|
83
|
-
|
42
|
+
Javaアプリ上に配置した「Port Closeボタン」を押下するとExceptionが発生します。(ソースコード内の(★))
|
43
|
+
eclipse上のエラーログを見ると、test.dllが32bitでビルドされていない旨の指摘に見えますが、
|
84
|
-
|
44
|
+
以下の記事を参考にtest.dllが32bitでビルドされていることは確認しています。
|
85
|
-
|
45
|
+
※test.dllのバイナリデータを確認すると、「0x504500004C01」となっていること
|
86
|
-
if(commPort != null){
|
87
|
-
commPort.close();
|
88
|
-
}
|
89
|
-
|
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
|
-
|
53
|
+
継続して調査を行っておりますが、現状行き詰っている状態です。
|
102
|
-
|
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
|
-
|
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
|
-
|
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:
|
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
|
+
以上です。
|