zoukankan      html  css  js  c++  java
  • JNI的使用

    主要参照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
  • 相关阅读:
    BZOJ1568:[JSOI2008]Blue Mary开公司
    HDU4348:To the moon
    洛谷【P3437】[POI2006]TET-Tetris 3D
    AtCoder Regular Contest 072 E:Alice in linear land
    AtCoder Grand Contest 014 D:Black and White Tree
    洛谷【P2664】树上游戏
    浅谈树分治
    BZOJ3784:树上的路径
    BZOJ2006:[NOI2010]超级钢琴
    BZOJ3648:寝室管理
  • 原文地址:https://www.cnblogs.com/JK-Z/p/12262027.html
Copyright © 2011-2022 走看看