`
lucane
  • 浏览: 119058 次
  • 性别: Icon_minigender_1
  • 来自: 江湖
社区版块
存档分类
最新评论

JNI笔记(GCC4.4.0编译器)

阅读更多
以下内容是自己在练习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
  • JNIDemo.zip (521.4 KB)
  • 描述: 工程源文件和一些文档
  • 下载次数: 32
分享到:
评论

相关推荐

    编译JNI的gcc指令代打和测试例程

    使用gcc和g++编译jni指令太长,很麻烦。所以做了一个编译工具JNIBuilder.jar。 因为是用于jni的,所以默认使用者的电脑上已经安装好Java和MinGW,并且可用。 并提供一个测试例程。功能是jni函数调用java函数弹出一个...

    关于Java的JNI开发时使用cl编译器的说明

    这里介绍使用Windows OS自带的c/c++编译器(cl)怎样把.c文档编译成.exe和.dll文档。为什么要把介绍使用cl把.c文档编译成.exe是因为java程序在使用.dll文档时,需要验证该文档功能的正确性,以方便Java代码的调试与...

    JNI笔记的相关内容

    JNI的学习笔记,多看看,很久没看就忘记了.

    JNI学习笔记

    JNI学习笔记 jni开发资料 使用Android studio 写JNI,适合初学者入门学习

    JNI学习笔记.doc

    JNI学习笔记.doc

    android JNI 学习笔记.doc

    android JNI 学习笔记 android JNI 学习笔记.doc

    android-JNI学习笔记

    JNI学习笔记,对学习android帮助极大

    黑马程序员JNI学习笔记

    针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------

    gcc makeFile入门(三)JNI.rar

    cygwin 下通过gcc编译dll文件,交给java调用

    Android JNI 学习笔记

    做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。

    jni.zip jni编译jni下载

    学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义

    java与c++交互(JNI学习笔记)

    1.C++与java交互基本介绍 2.C++获取java属性值、设置java属性值 3.C++创建java对象 4.C++中数据类型间的转换

    关于JNI详解及笔记

    JNI是现在app开发必须要了解的,本人将jni实现java与c互相调用的原理以及实现做了详细的讲解,希望对大家有所帮助

    Android学习笔记含JNI、USB和ftdi通信方式详解

    项目四 多线程文件下载 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.h和jni_md.h,提供需要的人下载!!!!!

    JNI资料大全JNI资料大全

    JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全JNI资料大全

    DELPHI开发JNI必备 jni.pas

    DELPHI开发JNI必备 jni.pas 包含文件 jni.pas JNI_MD.INC

Global site tag (gtag.js) - Google Analytics