做 JNI 方法如果完全用手一个个写,太麻烦,没有充份利用 IDE
带给我们的便利性,我来讲一下用 JBuilder和 VC6.0 IDE 环境做
JNI 的步骤。
1. 建一个 JB 工程。
2. 选 File->New 或点一下工具栏的 New 图标,选第一页的 Class
类型,选 OK,把类名改为 HelloWorld, 包名随意,这里假设为
空,把 Options 里面的五个选项全选上(可以酌情少选),产生
一个新的名为 HelloWorld 或 xxx.HelloWorld 的 class。
3. 修改一下这个 class,改成这个样子并保存:
public class HelloWorld {
public native void helloworld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().helloworld();
}
}
4. 这时在 project 流览器里可以看到刚刚产生的 HelloWorld.java
文件,在这个文件上点鼠标右键,选属性,打开 Build 属性页,
把 Generate jni file 叉叉划上,选 OK。
5. 编译这个 java 文件,这时将会看到在 HelloWorld.java 文件
下面多了一个HelloWorld.h,这是我们将要用到的本地方法的头文
件。
6. 打开 VC,选 Tools->Options->Directries->Show directries for
选中 include files。
把 /include, /include/win32 这两个目录加进去。
7. 选 File->New,给你的工程取个名字,在 project 页里选 Win32
Dynamic-Link Library,按 OK,选 Empty dll project。
8. 把开始的 HelloWorld.h 加到你的 VC 工程目录里面,并新建一
个 HelloWorld.c(可以是你想要的任意 .c 结尾的名字)源文件。
9. 在 HelloWorld.c 开始加上下面这几行声明:
#include
#include "HelloWorld.h"
#include // 因为下面要用到 printf 语句,所以要这个头文件。
10. 把 HelloWorld.h 里面方法声明拷贝过来,有多少拷多少,我们
这里只有
JNIEXPORT void JNICALL
Java_HelloWorld_helloworld(JNIEnv *, jobject)
并加上函数第一个参数和第二个参数的名字,方法体如下:
JNIEXPORT void JNICALL
Java_HelloWorld_helloworld(JNIEnv *env, jobject obj){
printf("Hello");
}
11. 在函数里加上任何你想要的 c 代码,按 F7,在工程的 debug
或 release 目录下将生成一个 dll 文件,把该 dll 文件改成 hello.dll
(也可在 project->settings->link 里面直接把生成的文件名变成
(你想要的目录)/hello.dll),并把该 dll 放到一个你的path 环境
设置里能找到的目录,一般放在当前目录就可以了。
12. 运行 java HelloWorld
如果你的 dll 和 class 都已经生成但是出现下面的异常
java.lang.UnsatisfiedLinkError: no hello in shared library path
at java.lang.Runtime.loadLibrary(Runtime.java)
at java.lang.System.loadLibrary(System.java)
at
at java.lang.Thread.init(Thread.java)
是因为你的 dll path 设置不正确,检查你的 java 源文件里这一行:
System.loadLibrary("hello");
loadLibrary 的参数应为你的 dll 文件名,但不包括括展名,比如说
你的 dll 文件为abc.dll,则应这样调用
System.loadLibrary("abc");
而不是
System.loadLibrary("abc.dll");
leaffall的package提示:
jni方法需要加native关键字
public native void myMethod();
在javah -jni MyClass产生的.h 文件中会有:
JNIEXPORT void JNICALL
Java_MyClass_myMethod(JNIEnv *, jobject);
如果你的类中有包的定义(package com.leaffall) 请修改为:
JNIEXPORT void JNICALL
Java_com_leaffall_MyClass_myMethod(JNIEnv *, jobject)
使用JBuilderr实现JNI编程
最新推荐文章于 2024-09-21 10:38:43 发布