首先要完成 Eclipse中 C/C++环境配置,请参考我的前一篇博客,“64位 win10下Eclipse C/C++环境配置”
然后再构建JNI应用。
在构建JNI应用中,主要参考下面这篇博客,原文为英文,我将其翻译为中文,同时将原文中几点错误的地方做了修改。
http://www.bogotobogo.com/cplusplus/eclipse_CDT_JNI_MinGW_64bit.php
1.创建Java Project
1.1)创建一个新的Java项目(HelloJNI)
1.2) 在该Java项目中新建一个Java类文件 HelloJNI.java
public class HelloJNI { static { // hello.dll on Windows or libhello.so on Linux System.loadLibrary("hello"); } private native void sayHello(); public static void main(String[] args) { // invoke the native method new HelloJNI().sayHello(); } }
2.将该Java项目转换为C/C++项目
2.1)右键点击 HelloJNI Java project-->new-->Other...
--->C/C++--->Convert to a C/C++ project(Adds C/C++ nature)-->Next
2.2) 在弹出的 "Convert to C/C++ project"对话框中,在“Project type”中选择
“Makefile Project”--> 在Toolchains中选择"MinGw GCC",然后finish.
2.3)到现在,我们既可以作为JAVA项目来运行该项目,也可以作为C/C++项目来运行它。
3.产生C/C++头文件
3.1) 在项目中创建一个“jni”文件夹来存放 C/C++代码。
右键点击项目 ---->New--->Folder. 命名为 jni.
3.2) 在“jni”文件夹中创建一个 "makefile"文件
右键点"jni"文件夹--->new--->File,在文件名中,输入文件名 "makefile",然后 finish
3.3)在makfile文件中输入如下代码。由于是makefile文件,文中的空格 为 “Tab”键,不是“Space”
# Define a variable for classpath CLASS_PATH = ../bin # Define a virtual path for .class in the bin directory vpath %.class $(CLASS_PATH) # $* matches the target filename without the extension HelloJNI.h : HelloJNI.class javah -classpath $(CLASS_PATH) $*
该makefile文件用来生成一个"HelloJNI.h"的目标文件,其依存于"HelloJNI.class",同时调用javah来生成。
右键点击 "jni'文件夹--->build target--->create...在弹出的菜单中,输入文件名 "HelloJNI.h",然后点击OK
3.4)运行 makefile文件,生成 "HelloJNI.h"
右键点击"jni"文件夹--->make targets-->build......---->"HelloJNI.h"--->Build
注意要确保保存了前面的文件(HelloJNI.java 和 makefile)
将成功生成"HelloJNI.h"文件,其存储在“jni”文件夹中。
4、生成 C文件---HelloJNI.c
4.1)创建“HelloJNI.c”的C文件
右键点击“jni”文件夹--->New---->Source file, 输入“HelloJNI.c”文件名
在文件中,输入如下代码:
#include <jni.h> #include <stdio.h> #include "HelloJNI.h" JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) { printf("Hello World!\n"); return; }
tips:有可能提示找不到jni.h文件,则将JAVA_HOME目录下的jni.h文件拷贝到 HelloJNI项目的"jni"目录下即可
然后修改为 #include "jni.h"
4.2)修改"makefile"文件,用来生成共享动态链接库文件 "hello.dll"
# Define a variable for classpath CLASS_PATH = ../bin # Define a virtual path for .class in the bin directory vpath %.class $(CLASS_PATH) all : hello.dll # $@ matches the target, $< matches the first dependancy hello.dll : HelloJNI.o gcc -m64 -Wl,--add-stdcall-alias -shared -o $@ $< # $@ matches the target, $< matches the first dependancy HelloJNI.o : HelloJNI.c HelloJNI.h gcc -m64 -I"C:\Program Files\Java\jdk1.7.0_21\include" -c $< -o $@ # $* matches the target filename without the extension HelloJNI.h : HelloJNI.class javah -classpath $(CLASS_PATH) $* clean : rm HelloJNI.h HelloJNI.o hello.dll
4.3)右键点击"jni"文件夹---->Make Targets--->Create....
在弹出的对话框中输入文件名"all";
重复该过程,创建目标文件 "clean"
4.4)运行目标文件“all”: 右键点击“jni”文件夹---->Make Targets--->Build....
选择 Target--->all---->Build
4.5)动态链接库文件"Hello.dll"将被创建,如下:
5、最后,运行Java JNI程序
5.1)最后我们需要给"hello.dll"指明 library的路径,可以通过VM 参数指明
右键点击项目--->Run AS--->Run Configurations
a)在 "Main"面板中,在Main class中输入 "HelloJNI"
b)在"Arguments"面板中,输入"-Djava.library.path=jni"
5.2)运行该项目,Bingo....