以下内容是自己在练习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函数弹出一个...
在Android环境下,GCC被用来编译本地C/C++代码,这些代码可以与Java代码一起使用,通过JNI(Java Native Interface)进行交互,以实现性能敏感的代码或者利用现有的C/C++库。 **G++** 是GCC的C++前端,负责处理C++...
这里介绍使用Windows OS自带的c/c++编译器(cl)怎样把.c文档编译成.exe和.dll文档。为什么要把介绍使用cl把.c文档编译成.exe是因为java程序在使用.dll文档时,需要验证该文档功能的正确性,以方便Java代码的调试与...
它提供了许多开源工具,包括GCC编译器,这对于在Windows上构建原生代码非常有用。 1. **安装Cygwin**: 在开始之前,你需要在你的Windows机器上安装Cygwin。访问Cygwin官网,下载安装程序,然后在安装过程中选择必要...
### JNI技术概述与应用 #### 一、为什么学习JNI? JNI(Java Native Interface)技术能够增强Java虚拟机的功能,使得Java程序能够直接调用本地语言(如C或C++)编写的函数。这对于提高程序性能、实现特定硬件访问...
### JNI学习笔记详解 #### 一、JNI简介 JNI(Java Native Interface)是Java平台提供的一种强大机制,它允许Java程序直接调用本地代码(通常是C或C++编写)。这为Java应用程序带来了额外的灵活性,使得开发者能够...
针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------
### Android JNI 学习笔记详解 #### 一、JNI简介 JNI(Java Native Interface)即Java本地接口,是Java平台标准的一部分,它允许Java代码和其他语言(如C、C++等)编写的本地代码进行交互。在Android开发中,通过...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...
2. **环境设置**:使用JNI前,开发者需要设置JNI头文件路径、编译器和链接器选项,以及确保Java Development Kit(JDK)和本地编译器正确安装。通常,开发者会创建一个`.h`头文件,该文件由Java源代码中的`native`...
《Java调用DLL技术:JNA 4.4.0详解》 在Java编程中,直接调用操作系统底层的动态链接库(DLL)是相对复杂的一件事情,因为Java是一种跨平台的语言,而DLL通常与特定的操作系统紧密关联。为了在Java中实现这一功能,...
JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java代码和其他语言写的代码提供了一个接口。在Java应用程序中,JNI允许Java代码调用本地(非Java)代码,反之亦然,使得开发者能够利用Java的跨平台...
2. **设置JNI开发环境**:安装TDM-GCC64,这是一个针对Windows的GCC编译器的64位版本,用于编译C或C++的本地代码。配置环境变量,确保编译器可以被系统找到。 3. **创建Java项目**:在IntelliJ IDEA中新建一个Java...
做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。
3. **本地库编译**:编写完本地方法后,需要使用C/C++编译器将其编译成动态链接库(如Windows下的`.dll`,Linux下的`.so`,或Mac OS X下的`.dylib`)。 4. **加载本地库**:在Java代码中,我们需要使用`System....
TDM-GCC是TDM(Tony's Development Manager)构建的GCC,它基于GCC,这是一个开源的、跨平台的编译器套件,支持多种编程语言,如C、C++、Fortran等。MinGW则是一个为Windows提供了一个GCC移植版的项目,它提供了运行...