zoukankan      html  css  js  c++  java
  • Java JNI初探

    ---说明,之前直接百度出来的例子,照猫画虎。没想到的是这例子居然直接来自百度百科,写着写着就囧了。。

    ---anyway,写完了就当是给自己看吧。

    同事求助,就看了一下,照猫画虎一番,略有所得。

    JNI是什么?

    NI是 Java Native Interface 的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。

    -- 以上来自百度百科

    JNI步骤

    ① java类中编写带有native 声明的方法。

    ② 使用 javac 命令编译所编写的java类。

    ③ 使用 javah 命令生成头文件。

    ④ 使用C/C++实现本地方法。

    ⑤ 生成动态连接库。

    ⑥ 执行(java)。

    --还是来自百度百科

    JNI实例

    1 public class HelloWorld {
    2     public native void displayHelloWorld();//所有native关键词修饰的都是对本地的声明
    3     static {
    4         System.loadLibrary("hello");//载入本地库
    5     }
    6     public static void main(String[] args) {
    7         new HelloWorld().displayHelloWorld();
    8     }
    9 }

    javac HelloWorld.java

    javah HelloWorld

    编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。

      建议用vs,新建 Win Console - DLL 项目,新建文件:HelloWorldImpl.cpp

     1 #include "jni.h"
     2 #include "HelloWorld.h"
     3  
     4 //#include other headers
     5  
     6 JNIEXPORT void JNICALL
     7 Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobject obj)
     8 {
     9     printf("Helloworld!
    ");
    10     return;
    11 }

    注意,这里使用的是"jni.h",也可以使用<jni.h>。前者将jni.h文件复制进来即可,后者需要在项目中引入其所在的文件夹($JAVA_HOME$/include)。

    但是,据我实测,实际上还需要 jni_md.h 文件,要么复制进来,要么引入其所在的文件夹($JAVA_HOME$/include/win32)。

    ⑤ 如无问题,就可以进行编译了。这里要注意一点,如果jdk是64位版本,那么dll也需要64位的。vs可以直接设置生成的版本。

    虽然可以使用单独的命令来生成dll文件,不过这里只是一个练习,直接build项目即可生成,然后在文件夹中就能找到。

    ⑥ 由于我们在Java中调用的hello,所以需要将该dll复制到java所在的文件夹,并重命名。

        static {
            System.loadLibrary("hello");//载入本地库
        }

    然后,运行即可。

    一般来说,如果第三方有提供dll,那可以直接调用执行。

    ps:如果不用vs,那也可以使用gcc,参考百度百科

  • 相关阅读:
    【杭电】[4883]TIANKENG’s restaurant
    【杭电】[4883]TIANKENG’s restaurant
    【POJ】[1423]Big Number
    【POJ】[1423]Big Number
    【杭电】[1280]前m大的数
    【杭电】[1280]前m大的数
    【杭电】[1576]A/B
    【杭电】[1576]A/B
    [leetcode]346. Moving Average from Data Stream滑动窗口平均值
    [leetcode]99. Recover Binary Search Tree恢复二叉搜索树
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5687392.html
Copyright © 2011-2022 走看看