eclipse+VC6.0开发JNI (1)

[b][size=medium][color=red]eclipse+VC6.0开发JNI (1)[/color][/size][/b]

1、eclipse新建一个普通的java project,如下图:

[img]http://dl.iteye.com/upload/attachment/0067/6065/6ff104da-5ee1-3180-be85-924914841307.png[/img]

TestNative.java的具体代码如下:

package org.hwq.main;

public class TestNative {
/**定义本地方法*/
public native void print();
/**main方法调用本地方法*/
public static void main(String[] args) {
new TestNative().print();
}
/**初始时候加载本地库文件,即是上面本地方法的c/c++实现*/
static{
System.loadLibrary("hello");
}
}


上面需要注意的是[color=red]System.loadLibrary("hello");[/color]这个。这里的[color=red]“hello”[/color]就是需要加载的库的名字。这里会面要提及,关键注意。只有加载了库文件,[color=red]print()[/color]这个本地方法才能使用。

2、生成.h头文件

上面通过eclipse编译后,启动cmd,进入该项目的bin目录下面。我这里是:[color=red]D:\workspace1\testNative\bin[/color],如下图:

[img]http://dl.iteye.com/upload/attachment/0067/6067/f1fc194b-962e-3809-9e80-5dfee6f98fbc.png[/img]

这里要注意,javah是jdk自带的工具类,能根据现有的类,生成相应的.h头文件。这里后面要跟上类的全名,即包名+类名。
这时候就可以通过文件夹,查看[color=red]D:\workspace1\testNative\bin[/color]下的文件。如下图:

[img]http://dl.iteye.com/upload/attachment/0067/6069/a04ce9fb-2086-35e3-ac6c-d178cd7030ca.png[/img]

我们可以看看这个生成头文件的内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_hwq_main_TestNative */

#ifndef _Included_org_hwq_main_TestNative
#define _Included_org_hwq_main_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_hwq_main_TestNative
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_hwq_main_TestNative_print
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


看到头文件中声明了一个方法[color=red]JNIEXPORT void JNICALL Java_org_hwq_main_TestNative_print (JNIEnv *, jobject);[/color],这个就是在java中对应[color=red]print()[/color]方法的本地实现方法名。

3、启动VC6.0编写对应c/c++源文件

启动VC6.0,[color=red]“新建”—工程—Win32 Dynamic-Link Libraay[/color],填写工程名,这里就要填写上面提到的库名[color=red]“hello”[/color]

[img]http://dl.iteye.com/upload/attachment/0067/6073/299a3c95-0a58-3620-b3ea-aa798676f71e.png[/img]

工程建完后,将上面生成的[color=red]org_hwq_main_TestNative.h[/color]文件复制到该项目目录下面。我这里是[color=red]C:\Program Files\Microsoft Visual Studio\MyProjects\hello[/color]。如下图:

[img]http://dl.iteye.com/upload/attachment/0067/6075/a8d41a97-652e-3321-86e6-ae2a7c7a9215.png[/img]

到VC6.0界面,将刚复制过来的头文件添加到项目头文件中。如下:

[img]http://dl.iteye.com/upload/attachment/0067/6077/98456be4-f8cb-3176-a693-f67805a8e8f1.png[/img]

接下来,编写本地方法实现的c/c++源文件。如下图:

[img]http://dl.iteye.com/upload/attachment/0067/6079/730457ce-7411-3d9d-a328-9d30afc4a3bd.png[/img]

TestNative.cpp文件内容如下:

#include <jni.h>
#include <stdio.h>
#include "org_hwq_main_TestNative.h"

JNIEXPORT void JNICALL Java_org_hwq_main_TestNative_print
(JNIEnv *env, jobject obj)
{
printf("hello wolrd,the first jni application!!!");
return;
}


这个cpp文件中,需要导入jni.h头文件,还有我们生成的头文件[color=red]org_hwq_main_TestNative.h[/color],然后方法就是[color=red]org_hwq_main_TestNative.h[/color]头文件中声明的那个。编写方法体,OK完毕。编译build就完事。
这是后我们到这个[color=red]C++项目下的Debug目录下面[/color]能看到一个[color=red]hello.dll[/color]的文件。将这个文件复制到[color=red]java项目的bin目录下[/color],和生成的头文件在一个目录。

[img]http://dl.iteye.com/upload/attachment/0067/6081/2ad93649-cf88-3b3a-89f3-586356beeb93.png[/img]

这时候就能运行了,我们先到cmd中运行试试。

[img]http://dl.iteye.com/upload/attachment/0067/6083/15272b8c-24e5-307b-9a15-97c7f5f2baf2.png[/img]

运行成功。

我们在到eclipse中去运行试试看。
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at org.hwq.main.TestNative.<clinit>(TestNative.java:12)


出现这个错误,没找到库文件hello。上面我们在cmd中运行成功了。为什么在eclipse中不能运行?这里的问题,我也不是太了解。不过有个解决方案。在系统的环境变量path中添加该java项目bin目录。这里是[color=red]D:\workspace1\testNative\bin[/color]

[img]http://dl.iteye.com/upload/attachment/0067/6085/ec494070-9adc-3f56-adb7-79576445329c.png[/img]

添加成功,确定,重启eclipse,再次运行就ok了。

[img]http://dl.iteye.com/upload/attachment/0067/6087/ef0aa589-0f11-300b-8975-a5eb71361c48.png[/img]

如果想图方便,可以直接将生成的.dll动态库文件放到system32文件夹下去,直接就能运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值