目录

 

1. JNI

1.1. JNI技术的使用场景

Java Native InterfaceJNIJava本地接口)是Java语言的本地编程接口java程序中,我们可以通过JNI实现一些用java语言不便实现的功能如下

1标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的(只能由其他语言编写)

2你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的

3程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们

4为了应用的安全性,会将一些复杂的逻辑和算法通过本地代码(CC++)来实现本地代码比字节码难以破解

 

建议不到万不得已不要使用JNI技术,一方面它需要你掌握更多的知识才可以驾驭,一方面使用了JNI你的程序就会丧失可移植性C/C++是非跨平台的)

1.2. 使用JNI实现HelloWorld

http://blog.csdn.net/xyang81/article/details/41777471

1编写java代码

我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单(称为JNI程序它实现的JNI规范,是JVM规范的一部分,所以可以运行于JVM。如下所示

class HelloWorld
{
    public native void displayHelloWorld();
    static {
        System.loadLibrary("hello");
    }
   
    public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
    }
}
注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello库,这就是我们在后面生成的hello.dll 

 

System.loadLibrary("HelloWorld");  

只需要指定动态库的名字即可,不需要加lib前缀,也不要加.so.dll.jnilib后缀java会去java.library.path系统属性指定的目录下查找动态库文件,如果没有找到会抛出java.lang.UnsatisfiedLinkError异常

System.load("/Users/yangxin/Desktop/libHelloWorld.jnilib");  

指定动态库的绝对路径名,需要加上前缀和后缀

 

2)创建.h文件
javac HelloWorld.java生成HelloWorld.class文件
javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

 

3)编写本地实现代码
在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImpl.cpp文件,内容如下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    printf("Hello world!/n");
    return;
}
注意我们这里includejni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.hJAVA_HOME/include里面。编译通过后再生成hello.dll文件

 

4运行java程序
把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.javaHelloWorld.classhello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world!的输出了

1.3. JNI技术使用总结

JNI开发流程主要分为以下6步:

1、编写声明了native方法的Java

2、将Java源代码编译成class字节码文件

3、用javah -jni命令生成.h头文件(javahjdk自带的一个命令,-jni参数表示将class中用native声明的函数生成jni规则的函数)

4、用本地代码实现.h头文件中的函数

5、将本地代码编译成动态库(windows*.dlllinux/unix*.somac os x*.jnilib

6、拷贝动态库至 java.library.path 本地库搜索目录下,并运行Java程序

1.4. 参考资料

http://blog.csdn.net/xyang81/article/details/41777471

http://blog.csdn.net/mingjava/article/details/180946

posted on 2018-12-04 23:44  Firefly(萤火虫)  阅读(9230)  评论(1编辑  收藏  举报