JNI是Java Native Interface的缩写,即JAVA本地化接口,从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
如果想要自定义一个本地方法,那么可以按照以下步骤操作:
-
类中声明native方法
HelloNative.java
package com.pg.test.jni; public class HelloNative { public static native void hello(String name); }
-
编译生成字节码文件(.class文件)
javac .\HelloNative.java
-
生成头文件(.h文件)
com_pg_test_jni_HelloNative.h
javah -cp 项目路径\src\main\java com.pg.test.jni.HelloNative
-cp 用于指定类文件的路径
【项目路径】需要替换成自己的项目的磁盘路径
注意:最后部分一定是全路径名 -
根据头文件.h用C或者C++编写实现方法
HelloNative.c
#include "com_pg_test_jni_HelloNative.h" #include <stdio.h> JNIEXPORT void JNICALL Java_com_pg_test_jni_HelloNative_hello(JNIEnv *env,jobject obj, jstring name) { const char *str; str = (*env)->GetStringUTFChars(env, name, NULL); if (str == NULL) { return; } printf("Hello %s !\n", str ); return; }
注意:要保证和头文件定义的方法名及参数一致
-
生成动态链接库.DLL文件
gcc -m64 -Wl,--add-stdcall-alias -I"C:\my\java\jdk1.8.0_202\include" -I"C:\my\java\jdk1.8.0_202\include\win32" -shared -o HelloNative.dll HelloNative.c
-m64表示生成的dll是64位的
注意,执行gcc命令需要安装gcc编译器,windows下需要使用MinGW,默认是没有的,需要手动下载安装,官网是 www.mingw.org,但需要翻墙,可以去sourceforge下载。
-
dll库加载
使用System.load("")
或者System.loadLibrary("")
加载dll库,前者需要填写全路径且带有扩展名,后者只需要文件名称即可
如果使用后者,那么需要dll文件放置在项目根路径或者system32或者JDK或jre的bin路径下。 -
调用示例代码
@SuppressWarnings("static-access") public static void main(String[] args) { System.loadLibrary("HelloNative"); new HelloNative().hello("JNI"); }
网友评论