简介java
JNI的实现步骤以下:.net
咱们开始来编写一个简单的Java call Ccode
public class HelloWorld { public native void hello(); static { //设置查找路径为当前项目路径 System.setProperty("java.library.path", "."); //加载动态库的名称 System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().hello(); } }
在终端执行 : javac HelloWorld.javablog
这时会生成HelloWorld.class 文件get
在终端执行 : java HelloWorld博客
这时会生成HelloWorld.h 头文件. 此文件内容不能修改。看下它的内容 :it
/* 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: hello * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_hello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
建立 HelloWorldImpl.c 文件io
#include "jni.h" #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){ printf("Hello World!\n"); return; }
使用命令生成动态连接库:编译
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib
libhello.jnilib 就是生成的动态连接库。可是运行这个命令报错了 :ast
In file included from HelloWorldImpl.c:1: /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/jni.h:45:10: fatal error: 'jni_md.h' file not found #include "jni_md.h" ^ 1 error generated.
提示jni_md.h这个文件找不到;咱们执行下面的命令拷贝一份:
sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include
在当前目录下执行 : ls -al
drwxr-xr-x 8 pengwei.xpw staff 272 Sep 10 15:31 . drwxr-xr-x 6 pengwei.xpw staff 204 Jan 8 2017 .. -rw-r--r-- 1 pengwei.xpw staff 567 Sep 10 15:25 HelloWorld.class -rw-r--r-- 1 pengwei.xpw staff 377 Sep 10 15:26 HelloWorld.h -rw-r--r-- 1 pengwei.xpw staff 341 Sep 10 15:25 HelloWorld.java -rw-r--r-- 1 pengwei.xpw staff 174 Sep 10 15:26 HelloWorldImpl.c drwxr-xr-x 3 pengwei.xpw staff 102 Nov 1 2016 com -rwxr-xr-x 1 pengwei.xpw staff 8400 Sep 10 15:31 libhello.jnilib
终端执行 : java HelloWorld
结果:
Hello World!
写在最后