• java调用c函数


    一、关于JNI

          JNI是Java Native Interface的缩写,JNI是JAVA平台专门用于和本地C代码进行相互操作的API,称为JAVA本地接口。

    二、JNI开发流程

    • 1.在JAVA中先声明一个native方法。
    • 2.通过javac -h或javah -jni命令导出JNI使用的C头头文件。
    • 3.使用C实现本地方法。
    • 4.将本地代码变异成动态库,windows下是.dll文件,linux下是.so文件。
    • 5.在JAVA程序中加载步骤4中生成的类库,执行JAVA程序,最终实现JAVA本地代码。

    三、示例

    1.使用native创建一个本地方法

    1. package com.test;
    2. public class TestJni {
    3. static {
    4. System.load("/path/to/libtest.so"); // 替换为实际的动态链接库文件路径
    5. }
    6. private static native int test(String inputPath, String outputPath);
    7. public static void main(String[] args) {
    8. int result = test("aa", "bb");
    9. if (result == 0) {
    10. System.out.println("0");
    11. } else {
    12. System.out.println("非0");
    13. }
    14. }
    15. }

    2. 使用javac -h生成头文件

    两种方式:

    1)用javac生成class和c头文件

    javac -h F:\workspace2\testShell\src\main\java\com\test TestJni.java -encoding UTF-8

     2)用javah生成c头文件

     

    javah -jni -encoding UTF-8  -classpath F:\workspace2\testShell\src\main\java com.test.TestJni

    生成后的c头文件如下:

    1. /* DO NOT EDIT THIS FILE - it is machine generated */
    2. #include <jni.h>
    3. /* Header for class com_test_TestJni */
    4. #ifndef _Included_com_test_TestJni
    5. #define _Included_com_test_TestJni
    6. #ifdef __cplusplus
    7. extern "C" {
    8. #endif
    9. /*
    10. * Class: com_test_TestJni
    11. * Method: test
    12. * Signature: (Ljava/lang/String;Ljava/lang/String;)I
    13. */
    14. JNIEXPORT jint JNICALL Java_com_test_TestJni_test
    15. (JNIEnv *, jclass, jstring, jstring);
    16. #ifdef __cplusplus
    17. }
    18. #endif
    19. #endif

    需要自行修改加上参数变量名称

    写c文件

    3.在linux下,编写该C代码的动态库

    gcc -fPIC -I/opt/ctools/jdk1.8.0_301/include/ -I/opt/ctools/jdk1.8.0_301/include/linux/ -shared -o libTestJni.so TestJni.c

    4.调用

    修改如下编译生产的库文件路径,就可执行java代码调用了。

  • 相关阅读:
    pandas的使用
    275. H 指数 II Python
    C++设计模式_创建型模式_工厂方法模式
    快速入门安装及使用&git与svn的区别&常用命令
    MAC 搭建vue开发环境,配置环境变量
    TRex学习之旅五
    R-CNN,Fast R-CNN详解
    TodoList经典案例
    【Bash】常用命令总结
    附录A printf、varargs与stdarg A.1 printf函数族
  • 原文地址:https://blog.csdn.net/yztezhl/article/details/134464817