在Eclipse下编写JNI对于使用NDK开发Android应用程序非常方便。
您需要安装Eclipse和Eclipse CDT(C / C ++开发工具)插件。
第1步:创建Java项目
创建一个新的Java项目(说HelloJNI
)和以下Java类“ HelloJNI.java
”:
公共类HelloJNI {
静态的 {
的System.loadLibrary( “你好”); // hello.dll(Windows)或libhello.so(Unixes)
}
//声明本机方法
private native void sayHello();
//测试驱动程序
public static void main(String [] args){
new HelloJNI()。sayHello(); //调用本机方法
}
}
静态的 {
的System.loadLibrary( “你好”); // hello.dll(Windows)或libhello.so(Unixes)
}
//声明本机方法
private native void sayHello();
//测试驱动程序
public static void main(String [] args){
new HelloJNI()。sayHello(); //调用本机方法
}
}
第2步:将Java项目转换为C / C ++ Makefile项目
右键单击“ HelloJNI
”Java项目⇒新建⇒其他...⇒转换为C / C ++项目(添加C / C ++性质)⇒下一步。
将出现“转换为C / C ++项目”对话框。 在“项目类型”中,选择“ Makefile项目 ”⇒在“工具链”中,选择“MinGW GCC”⇒完成。
现在,您可以将此项目作为Java和C / C ++项目运行。
第3步:生成C / C ++头文件
通过右键单击项目⇒新建⇒文件夹⇒在“文件夹名称”中,在项目下创建一个名为“ jni
”的目录以保留所有C / C ++代码,输入“ jni
”。
在“ jni
”目录下创建一个“ makefile
”,右键单击“ jni
”文件夹⇒new⇒文件⇒在“文件名”中输入“ makefile
”⇒输入以下代码。 请注意,您需要使用制表符(而不是空格)进行缩进。
#为classpath定义一个变量
CLASS_PATH = ../bin
#在bin目录中定义.class的虚拟路径
vpath%.class $(CLASS_PATH)
#$ *匹配没有扩展名的目标文件名
HelloJNI.h:HelloJNI.class
javah -classpath $(CLASS_PATH)$ *
#为classpath定义一个变量
CLASS_PATH = ../bin
#在bin目录中定义.class的虚拟路径
vpath%.class $(CLASS_PATH)
#$ *匹配没有扩展名的目标文件名
HelloJNI.h:HelloJNI.class
javah -classpath $(CLASS_PATH)$ *
此makefile创建一个目标“ HelloJNI.h
”,它具有依赖项“ HelloJNI.class
”,并在HelloJNI.class
(在-classpath
下)调用javah
实用程序来构建目标头文件。
右键单击makefile⇒制作目标⇒创建⇒在“目标名称”中,输入“ HelloJNI.h
”。
通过右键单击makefile⇒运行目标⇒构建⇒选择目标“ HelloJNI.h
”⇒构建,运行目标“ HelloJNI.h
”的makefile。 头文件“ HelloJNI.h
”应在“ jni
”目录中生成。 必要时刷新(F5)。 产出是:
制作HelloJNI.h
javah -classpath ../bin HelloJNI
javah -classpath ../bin HelloJNI
或者,您也可以使用CMD shell运行make文件:
//将目录更改为包含makefile的目录
> 制作HelloJNI.h
//将目录更改为包含makefile的目录
> 制作HelloJNI.h
您甚至可以使用CMD shell来运行javah
:
> javah -classpath ../bin HelloJNI
javah -classpath ../bin HelloJNI
第4步:C实现 - HelloJNI.c
通过右键单击“ jni
”文件夹⇒新建⇒源文件⇒在“源文件”中输入“ HelloJNI.c
”,创建一个名为“ HelloJNI.c
”的C程序。 输入以下代码:
#include <jni.h>
#include <stdio.h>
#include“HelloJNI.h”
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv * env,jobject thisObj){
printf(“Hello World!\ n”);
返回;
}
#include <stdio.h>
#include“HelloJNI.h”
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv * env,jobject thisObj){
printf(“Hello World!\ n”);
返回;
}
按如下所示修改“ makefile
”以生成共享库“ hello.dll
”。 (再次使用tab来缩进行。)
#为classpath定义一个变量
CLASS_PATH = ../bin
#在bin目录中定义.class的虚拟路径
vpath%.class $(CLASS_PATH)
all:hello.dll
#$ @匹配目标,$ <匹配第一个依赖项
hello.dll:HelloJNI.o
gcc -Wl, - add-stdcall-alias -shared -o $ @ $ <
#$ @匹配目标,$ <匹配第一个依赖项
HelloJNI.o:HelloJNI.c HelloJNI.h
gcc -I“D:\ bin \ jdk1.7 \ include”-I“D:\ bin \ jdk1.7 \ include \ win32”-c $ <-o $ @
#$ *匹配没有扩展名的目标文件名
HelloJNI.h:HelloJNI.class
javah -classpath $(CLASS_PATH)$ *
干净:
rm HelloJNI.h HelloJNI.o hello.dll
#为classpath定义一个变量
CLASS_PATH = ../bin
#在bin目录中定义.class的虚拟路径
vpath%.class $(CLASS_PATH)
all:hello.dll
#$ @匹配目标,$ <匹配第一个依赖项
hello.dll:HelloJNI.o
gcc -Wl, - add-stdcall-alias -shared -o $ @ $ <
#$ @匹配目标,$ <匹配第一个依赖项
HelloJNI.o:HelloJNI.c HelloJNI.h
gcc -I“D:\ bin \ jdk1.7 \ include”-I“D:\ bin \ jdk1.7 \ include \ win32”-c $ <-o $ @
#$ *匹配没有扩展名的目标文件名
HelloJNI.h:HelloJNI.class
javah -classpath $(CLASS_PATH)$ *
干净:
rm HelloJNI.h HelloJNI.o hello.dll
右键单击“ makefile
”⇒制作目标⇒创建⇒在“目标名称”中,输入“
”。 重复以创建目标“ all
clean
”。
通过右键单击makefile⇒运行目标⇒构建⇒选择目标“ all
”⇒构建,运行目标“ all
”的makefile。 产出是:
做所有
javah -classpath ../bin HelloJNI
gcc -I“D:\ bin \ jdk1.7 \ include”-I“D:\ bin \ jdk1.7 \ include \ win32”-c HelloJNI.c -o HelloJNI.o
gcc -Wl, - add-stdcall-alias -shared -o hello.dll HelloJNI.o
javah -classpath ../bin HelloJNI
gcc -I“D:\ bin \ jdk1.7 \ include”-I“D:\ bin \ jdk1.7 \ include \ win32”-c HelloJNI.c -o HelloJNI.o
gcc -Wl, - add-stdcall-alias -shared -o hello.dll HelloJNI.o
共享库“ hello.dll
”应在“ jni
”目录中创建。
第5步:运行Java JNI程序
您可以运行Java JNI程序HelloJNI
。 但是,您需要提供“ hello.dll
”的库路径。 这可以通过VM参数-Djava.library.path
来完成。 右键单击项目⇒运行方式⇒运行配置⇒选择“Java应用程序”⇒在“主”选项卡中,输入主类“ HelloJNI
”⇒在“参数”,“VM参数”中,输入“ -Djava.library.path=jni
“⇒运行。
您将看到输出“Hello World!” 显示在控制台上。
[去做]