[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的具体代码如下:
上面需要注意的是[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]
我们可以看看这个生成头文件的内容:
看到头文件中声明了一个方法[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文件内容如下:
这个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中去运行试试看。
出现这个错误,没找到库文件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文件夹下去,直接就能运行。
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文件夹下去,直接就能运行。