• Java的JNI


     目录

    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

  • 相关阅读:
    MVC中权限管理
    ElasticSearch作为Windows服务启动
    linux下mysql常用的一些命令
    用Markdown写博客
    JAVA设计模式——简单工厂
    JAVA设计模式——单例模式
    JAVA设计模式——开篇
    Centos7.3安装和配置Mysql5.7
    java开发环境配置——IDEA SVN的使用
    java开发环境配置——IntelliJ IDEA
  • 原文地址:https://www.cnblogs.com/zhizaixingzou/p/10068405.html
Copyright © 2020-2023  润新知