- 论坛徽章:
- 0
|
JNI入门的东西网上已经很多了,转来转去也没多大意思,简单地写一下自己理解的方法,另外主要是说一些自己遇到的情况。
所谓JNI就是java和本地其它平台语言的一个接口规范,我用的是c++。调用分为两种,第一种是本地语言实现java定义的方法并
返回数值,第二种是本地语言方法中引用java定义的数据以及方法,如果包括访问java定义的class数组,异常等东西就显得有些麻
烦了。
不过我为了简化工作只使用了最简单的第一种方式,分为以下三个白痴步骤:
1.写java部分,定义方法,此步骤的文件自然是*.java,编译(两种方法:javac命令行,jBuilder等编程工具),生成的文件是*.class
2.javah把*.class编译生成*.h文件,*.h中包含了要在c中实现的函数的名称以及参数格式。这种文件是符合c语言的头文件
3.c++建立dll工程文件,并添加自己的.h文件和.cpp文件,把*.h中的要实现的函数拷贝过来,在c中实现即可以,编译生成的dll给java用就大功告成了,c的源代码就可以扔掉了……
来玩最简单的helloworld吧,唉,基于我的所有程序新装的以及根本不会编程,还是折腾了我一个上午,三个步骤……
以下实现的平台:JBuildx(jdk1.4.2_04),VS.net2003,winXP(sp2),其它系统或平台有错误概不负责-_-
1.我是用jBuilderX先建立工程文件,然后添加一个类,直接在jBuildX下面,HelloWorld.java右键点击Make,很顺利地编译,当然可以用javac命令行,加一些参数编译,没有试。
只要注意两点就行了static{}里面写loadLibrary,load的就是将来的dll文件的名字,文件名字不用写成hello.dll,只要hello就可以,系统会自己判断。另外可以写多个的loadLibrary
所要实现的方法加上native关键字,表示用JNI实现。
class HelloWorld {
public native void displayHelloWorld();
static
{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloWorld().displayHelloWorld();
}
}
2.javah命令行编译的时候找不到指定程序,自然是环境变量设置的问题。第一步用的jBuilderX编译,如果用javac编译照样会出现找不到程序的错误。
我修改的方法,打开我的电脑,属性,高级,环境变量
用户变量中新建
PATH C:\JBuilderX\jdk1.4\bin
CLASSPATH C:\JBuilderX\jdk1.4\lib
系统变量新建
CLASSPATH C:\JBuilderX\jdk1.4\lib
系统变量修改
PATH 增加PATH ;C:\JBuilderX\jdk1.4\bin
然后确定就可以,不用重启电脑
搞定之后比较弱智的方法,进入到helloworld.class的目录下直接javah helloworld就产生helloworld.h,具体内容不说了,里面JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);就是要native实现的函数,如果有package的话,应该就是JNIEXPORT void JNICALL Java_MyPackage_HelloWorld_displayHelloWorld (JNIEnv *, jobject);
3.建立一个空的dll工程,名称hello(最好选空,那些自动生成的文件没啥用),然后添加一个hello.cpp文件,把helloworld.h拷贝到c的工程目录下。include的时候要包含两项jni.h,HelloWorld.h。
这里要设置c中的项目路径,即包含java中与JNI相关的头文件,VS.net2003的设置在工具->选项->项目->VC++目录,把java所在的include目录添加进去就可以了。
不过我这么做了之后仍然告知我找不到jni.h和jni_md.h,后来按照网上的方法,直接把这两个.h文件拷贝到Microsoft Visual Studio .NET 2003\Vc7\include目录下面终于没问题了,其中这两个.h分别位于jdk1.4\include和jdk1.4\include\win32目录下面。
#include
#include"HelloWorld.h"
#include
using namespace std;
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
cout
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/22516/showart_161675.html |
|