以下内容是自己在练习JNI的时候写下的,新手直接看以下文字可能无法理解。
建议新手先找一些入门的资料参看。
以下内容中可能存在一些不正确的地方,如遇到请指出,谢谢。
----------------------------------------------------------------SEPARATE-LINE----------------------------------------------------------------
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
用GCC3编译一直出现如上错误,MinGW运行环境有问题?或者是缺少相关文件
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)
网上比较多的这种错误是找不到DLL
但这里能找到DLL,找不到方法
迷茫了很久,查了很久,发现了
这篇http://dikar.iteye.com/blog/382701文章
用Dependency Walker查看生成的DLL
方法名字为Java_com_live_xscript_altas_demo_lang_jni_ShowMessage_showMessage
@12
比起正规的名字多了'
@12'
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
分享到:
相关推荐
使用gcc和g++编译jni指令太长,很麻烦。所以做了一个编译工具JNIBuilder.jar。 因为是用于jni的,所以默认使用者的电脑上已经安装好Java和MinGW,并且可用。 并提供一个测试例程。功能是jni函数调用java函数弹出一个...
这里介绍使用Windows OS自带的c/c++编译器(cl)怎样把.c文档编译成.exe和.dll文档。为什么要把介绍使用cl把.c文档编译成.exe是因为java程序在使用.dll文档时,需要验证该文档功能的正确性,以方便Java代码的调试与...
JNI的学习笔记,多看看,很久没看就忘记了.
JNI学习笔记 jni开发资料 使用Android studio 写JNI,适合初学者入门学习
JNI学习笔记.doc
android JNI 学习笔记 android JNI 学习笔记.doc
JNI学习笔记,对学习android帮助极大
针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------
cygwin 下通过gcc编译dll文件,交给java调用
做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。
学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义
1.C++与java交互基本介绍 2.C++获取java属性值、设置java属性值 3.C++创建java对象 4.C++中数据类型间的转换
JNI是现在app开发必须要了解的,本人将jni实现java与c互相调用的原理以及实现做了详细的讲解,希望对大家有所帮助
项目四 多线程文件下载 25 项目五 Android自定义树形菜单 26 项目六 高仿微信聊天 26 项目七 Android串口通信 26 1. Java层 26 2.JNI层 26 3.PC模拟MCU层 26 4.问题 26 ...二、 uses Uart(through JNI) 44
JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!
JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全
DELPHI开发JNI必备 jni.pas 包含文件 jni.pas JNI_MD.INC