JNI Windows学习环境搭建
我是为了编写Android Native代码才研究JNI的,有些基本问题就不说了。
1.JNI是什么?在这里没有必要说,不了解可以看看我上次推荐的书。
2.JNI和Android的关系。百度一下Android NDK就知道了。
回归正题,学习JNI技术需要搭建一个开发环境.JNI可以搭建Windows和Linux运行环境.在Windows环境中Java调用.dll,在Linux环境中Java调用.so。
环境要求:
JDK;
VC6/VSS(Windows );
gcc cc(Linux);
如果就学习JNI本身,最方便还是在Windows环境编译成DLL库给Java调用。这里就简要的记录一下过程。
1.安装JDK,设置JAVA_HOME,CLASS_PATH等环境变量,java的bin目录加入到PATH环境变量中。
2.写一段Java代码,HelloWorld.java
a.到java源代码目录运行下面的命令,编译java文件为class文件。
javac HelloWorld.java
b.生成给c语言的头文件(注意,运行javah前要保证有.class文件)
javah HelloWorld
此时将生成:HelloWorld.h文件。
c.在VC6中用向导生成一个Win32的DLL项目。
把刚生成的HelloWorld.h 复制到当前DLL项目目录,加入到项目组。
把HelloWorld.h 中的函数说明复制到cpp文件中开始填空。
在cpp的头部添加#include "HelloWorld.h"
因为编译的时候会用到jni.h和jni_md.h文件,说在DLL项目项目设置中增加需要包含的路径:%JAVA_HOME%\include;%JAVA_HOME%\include\win32
编译DLL项目,把DLL复制到Java的源代码目录。运行java程序
java HelloWorld
关于DLL的路径问题:
1.DLL可以copy到当前的Java源代码目录。
2.DLL可以copy到Windows\system32目录下。
3.可以通过 java -Djava.library.path=. HelloWorld 指定DLL路径。
java代码:
HelloWorld.java class HelloWorld { private native void print(); public static void main(String[] args) { new HelloWorld().print(); } static { System.loadLibrary("HelloWorld"); } }
cpp代码:
#include "stdafx.h" #include "HelloWorld.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) { printf("Hello World!\n"); return; }