Java JNI初探

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

---anyway,写完了就当是给本身看吧。编程

 

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

 

 

JNI是什么?ui

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

-- 以上来自百度百科spa

 

JNI步骤设计

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

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

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

④ 使用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!\n");
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,参考百度百科

相关文章
相关标签/搜索