Do more! Do better!

JNI的使用

Posted on By zjk

主要参照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!\n");
       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!\n", str);
     return;
   }

第五步:生成C共享库

将jni.h(\Java\jdk-11.0.2\include)和jni_md.h(\Java\jdk-11.0.2\include\win32)复制到到当前文件夹。
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