原文地址:
http://blog.youkuaiyun.com/believefym/archive/2007/06/08/1644635.aspx
JNI=java native interface, 为java应用程序提供调用本地方法的接口
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications.
You may want to implement a small portion of time-critical co de in a lower-level programming language, such as assembly, and then have your Java application call these functions
步骤:
1.编写带有native声明的方法的java类
package
jni;
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
HelloWorld
...
{
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
static...{
System.loadLibrary("hellodll");
}
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public native void dispHelloWorld();
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/** *//**
* @param args
*/
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public static void main(String[] args) ...{
// TODO Auto-generated method stub
//System.out.println("abc");
new HelloWorld().dispHelloWorld();
}
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
2,保存后如果没有错误eclipse会编译产生jni/HelloWorld.class
3,假设工程产生的class都在 classes文件夹下(这个文件夹名字跟个人eclipse设置有关,也可能就是工程根目录),那么控制台cd到classes用javah命令产生h 文件,XXX/classes>javah -jni jni.HelloWorld(package不要漏掉),产生的jni_HelloWorld.h文件如下
/**/
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
<
jni.h
>
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/* Header for class jni_HelloWorld */
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#ifndef _Included_jni_HelloWorld
#define
_Included_jni_HelloWorld
#ifdef __cplusplus
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
extern
"
C
"
...
{
#endif
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
/**//*
* Class: jni_HelloWorld
* Method: dispHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jni_HelloWorld_dispHelloWorld
(JNIEnv *, jobject);
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
#ifdef __cplusplus
}
#endif
#endif
4,写cpp,实现jni_HelloWorld.h中的函数,这里请注意函数名,cpp里的函数名跟h文件的函数名要一致,如果是从网上 copy的一些例子,函数名跟你例子的名字不一致虽然之后可以正确编译并产生dll,但是最终运行java程序链接的时候会出错,抛出 java.lang.UnsatisfiedLinkError异常,本人就在此浪费了很长时间。
jni_HelloWorldImp.cpp内容如下:
#include
<
jni.h
>
#include
"
jni_HelloWorld.h
"
#include
<
stdio.h
>
JNIEXPORT
void
JNICALL Java_jni_HelloWorld_dispHelloWorld
(JNIEnv
*
env, jobject obj)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
printf("Hello world ! ");
return;
}
5,编译cpp产生dll,在控制台下>cl -I%java_home%\include -I%java_home%\include\win32 -LD jni_HelloWorldImp.cpp -Fehellodll.dll
以上命令的参数中,-I表示编译包含的额外目录,-LD表示产生dll,-Fe后面表示产生dll的名字,具体的参数可以自己用cl -help命令查看,cl环境配置可以参考 用vs编译器cl在控制台下编译一文
如果成功编译,会产生hellodll.dll,hellodll.lib,hellodll.exp三个文件,将hellodll.dll考到工程根目录下。
6,运行java程序,输出Hello world !
原文地址: http://blog.youkuaiyun.com/believefym/archive/2007/06/08/1644635.aspx
JNI=java native interface, 为java应用程序提供调用本地方法的接口
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications.
You may want to implement a small portion of time-critical co
步骤:
1.编写带有native声明的方法的java类
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
2,保存后如果没有错误eclipse会编译产生jni/HelloWorld.class
3,假设工程产生的class都在 classes文件夹下(这个文件夹名字跟个人eclipse设置有关,也可能就是工程根目录),那么控制台cd到classes用javah命令产生h 文件,XXX/classes>javah -jni jni.HelloWorld(package不要漏掉),产生的jni_HelloWorld.h文件如下
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/7ff8d92cded7e0ce15e7ca1acc870052.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
4,写cpp,实现jni_HelloWorld.h中的函数,这里请注意函数名,cpp里的函数名跟h文件的函数名要一致,如果是从网上 copy的一些例子,函数名跟你例子的名字不一致虽然之后可以正确编译并产生dll,但是最终运行java程序链接的时候会出错,抛出 java.lang.UnsatisfiedLinkError异常,本人就在此浪费了很长时间。
jni_HelloWorldImp.cpp内容如下:
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/1327ab569c1ae82736693a50b8e33378.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![eclipse下jni初试[转] - scan - scan的博客](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
5,编译cpp产生dll,在控制台下>cl -I%java_home%\include -I%java_home%\include\win32 -LD jni_HelloWorldImp.cpp -Fehellodll.dll
以上命令的参数中,-I表示编译包含的额外目录,-LD表示产生dll,-Fe后面表示产生dll的名字,具体的参数可以自己用cl -help命令查看,cl环境配置可以参考 用vs编译器cl在控制台下编译一文
如果成功编译,会产生hellodll.dll,hellodll.lib,hellodll.exp三个文件,将hellodll.dll考到工程根目录下。
6,运行java程序,输出Hello world !
原文地址: http://blog.youkuaiyun.com/believefym/archive/2007/06/08/1644635.aspx