JNI筆記(GCC4.4.0編譯器)

以下內容是自己在練習JNI的時候寫下的,新手直接看以下文字可能無法理解。
建議新手先找一些入門的資料參看。
以下內容中可能存在一些不正確的地方,如遇到請指出,謝謝。

[color=red]----------------------------------------------------------------SEPARATE-LINE----------------------------------------------------------------[/color]

D:\ws\JNIDemo\bin>javah -jni com.live.xscript.altas.demo.lang.jni.ShowMessage

D:\ws\JNIDemo\bin>gcc -Wall -shared MsgImpl.c -o MsgImpl.dll

jni.h: No such file or directory

設置環境變量

CPLUS_INCLUDE_PATH
C_INCLUDE_PATH
LIBRARY_PATH

http://yanchde.gozaru.jp/mingw/wingw_start.html
奇怪的人民幣符號¥

http://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html#Environment-Variables
http://www.mingw.org/wiki/IncludePathHOWTO

D:/Program Files/Java/jdk1.5.0/include/jni.h:525: error: syntax error before '*' token

[color=green]用GCC3編譯一直出現如上錯誤,MinGW運行環境有問題?或者是缺少相關文件[/color]

In file included from MsgImpl.c:3:
com_live_xscript_altas_demo_lang_jni_ShowMessage.h:13: error: syntax error before "void"
com_live_xscript_altas_demo_lang_jni_ShowMessage.h:14: warning: data definition has no type or storage class
MsgImpl.c:5: error: syntax error before "void"


JNIEXPORT void JNICALL
Java_com_live_xscript_altas_demo_lang_jni_ShowMessage_showMessage (JNIEnv*, jobject, jstring);


將GCC升級爲4.4.0以後再次編譯DLL出現
D:\Program Files\Java\jdk1.5.0\include/jni.h:27:20: error: jni_md.h: No such file or directory

追加jni_md.h的路徑到
C_INCLUDE_PATH
%JAVA_HOME%\include\win32

可以成功編譯DLL了

MsgImpl.c:7: error: request for member 'GetStringUTFChars' in something not a st
ructure or union

C和C++的區別
注意gcc&g++
g++ -Wall -shared MsgImpl.c -o MsgImpl.dll


運行Java時出現
java.lang.UnsatisfiedLinkError


Thrown if the Java Virtual Machine cannot find an appropriate native-language definition of a method declared native.

找不到本地語言的定義

Exception in thread "main" java.lang.UnsatisfiedLinkError: showMessage
at com.live.xscript.altas.demo.lang.jni.ShowMessage.showMessage(Native Method)
at com.live.xscript.altas.demo.lang.jni.ShowMessage.main(ShowMessage.java:16)

[color=green]
網上比較多的這種錯誤是找不到DLL
但這裏能找到DLL,找不到方法[/color]
迷茫了很久,查了很久,發現了[url=http://dikar.iteye.com/blog/382701]這篇[/url]http://dikar.iteye.com/blog/382701文章

用Dependency Walker查看生成的DLL
方法名字爲Java_com_live_xscript_altas_demo_lang_jni_ShowMessage_showMessage[color=blue]@12[/color]
比起正規的名字多了'[color=blue]@12[/color]'
http://dikar.iteye.com/blog/382701
提供瞭解決辦法
g++ -Wall -Wl,--kill-at -shared ShowMessage.c -o ShowMessage.dll

或者
g++ -Wall -Wl,--add-stdcall-alias -shared ShowMessage.c -o ShowMessage.dll


於是最簡單的JNI程序就出來了,只有一個Java文件ShowMessage

後面的另一個程序,往Native程序中傳Java對象就相對簡單多了
MyJavaClass.java
UserObjects.java
兩個文件

ld --help
ld是幹什麼的

還有很多問題沒有解決
native方法返回值問題
GetStringUTFChars等方法的返回值類型,只能是char嗎?

下面是GCC環境變量

g++ --version


g++ (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


MinGW
D:\Program Files\ccpp\MinGW


C_INCLUDE_PATH
%JAVA_HOME%\include;%JAVA_HOME%\include\win32;%MINGW%\include;%MINGW%\lib\gcc\mingw32\4.4.0\include;%WIN32API_BASE%\include


CPLUS_INCLUDE_PATH
%MinGW%\lib\gcc\mingw32\4.4.0\include\c++;%MinGW%\lib\gcc\mingw32\4.4.0\include\c++\backward;%C_INCLUDE_PATH%


LIBRARY_PATH
%JAVA_HOME%\lib;%MINGW%\lib;%MinGW%\lib\gcc\mingw32\4.4.0;%WIN32API_BASE%\lib


PATH
%MinGW%\bin;%MinGW%\libexec\gcc\mingw32\4.4.0;%PYTHON_HOME%;%JAVA_HOME%\bin;d:\oracle\product\10.2.0\db_1\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;D:\Program Files\TortoiseSVN\bin;D:\Program Files\md5;%GNU_BASE%\make\bin


問題&解決方法
d:/program files/ccpp/mingw/bin/../lib/gcc/mingw32/4.4.0/../../../../mingw32/bin/ld.exe: cannot find -luser32
collect2: ld returned 1 exit status

追加
WIN32API_BASE
D:\Program Files\ccpp\w32api-3.13


缺少相關的lib
libgcc_s_dw2-1.dll在gcc-core-4.4.0-mingw32-dll中

在gcc4.4.0下載頁面中(http://sourceforge.net/projects/mingw/files/)
gmp
mpfr
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章