主要参照https://blog.csdn.net/joeysheng/article/details/65446025但是有些地方不一样,涉及原文的bug和环境差异。
第一步:编写Java代码
class HelloJNI{
// 本地方法声明
native void printHello();
native void printString(String str);
// 加载库
static{ System.loadLibrary("HelloJNI"); }
public static void main(String args[])
{
HelloJNI myJNI = new HelloJNI();
// 调用本地方法(实际调用的事使用C语言编写的JNI本地函数)
myJNI.printHello();
myJNI.printString("Hello World from printString fun");
}
}
第二步:编译Java代码
javac HelloJNI.java
第三步:生成C语言头文件
使用javah命令生成C语言头文件,命令如下
javah HelloJNI
可能原文撰写时间较早,这个命令其实在java10之后就不支持了,可以参照前一篇的tips
第四步:编写C代码
#include "CPP_JNI.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_test_printHello(JNIEnv *env, jobject object)
{
printf("Hello World!
");
return;
}
JNIEXPORT void JNICALL Java_test_printString(JNIEnv *env, jobject object, jstring string)
{
// 将 Java String转换为C字符串
const char *str = (*env)->GetStringUTFChars(env,string,0);
printf("%s!
", str);
return;
}
第五步:生成C共享库
将jni.h(Javajdk-11.0.2include)和jni_md.h(Javajdk-11.0.2includewin32)复制到到当前文件夹。
win下执行命令行
gcc -fPIC -shared HelloJNI.c -o HelloJNI.dll
这里我出了一个问题
Can't load IA 32-bit .dll on a AMD 64-bit platform
jdk是64位的,然后gcc生成的dll是32位的,然后报错。所以重新装了64位的gcc,重新打包成功运行。
第六步:运行Java程序
java HelloJNI