自学内容网 自学内容网

根据.h头文件中的方法声明,在 C/C++ 源文件中实现对应的函数

1、定义native函数:

public class MathUtils {
    public native int add(int a, int b);
    public native int subtract(int a, int b);

    static {
        System.loadLibrary("MathUtils");
    }
}

2、生成头文件:

使用 javah 命令生成对应的 C 头文件 com_example_MathUtils.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_MathUtils */

#ifndef _Included_com_example_MathUtils
#define _Included_com_example_MathUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_MathUtils
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_MathUtils_add
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     com_example_MathUtils
 * Method:    subtract
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_MathUtils_subtract
  (JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif

3、在 C++ 源文件 MathUtils.cpp 中实现这两个方法:

注意:

  • 引入头文件;
  • 函数的命名和参数类型需要与头文件中的声明一致
#include "com_example_MathUtils.h"

JNIEXPORT jint JNICALL Java_com_example_MathUtils_add
  (JNIEnv* env, jobject obj, jint a, jint b) {
    return a + b;
}

JNIEXPORT jint JNICALL Java_com_example_MathUtils_subtract
  (JNIEnv* env, jobject obj, jint a, jint b) {
    return a - b;
}

方法解释:

  • 函数声明使用 extern “C” 包裹,确保使用 C 语言的函数名修饰规则。
  • 参数类型和返回值类型使用 JNI 定义的 C++ 类型,如 jint 对应 int。
  • JNIEnv* 参数用于与 Java 端进行交互。
  • jobject 参数是调用该 native 方法的 Java 对象实例。

4、编译、使用:

编译这个 C++ 源文件,生成动态链接库文件 libMathUtils.so(或 .dll)。
最后在 Java 端加载这个动态库并调用 native 方法:

public class Main {
    public static void main(String[] args) {
        System.loadLibrary("MathUtils");
        MathUtils utils = new MathUtils();
        int result = utils.add(2, 3);
        System.out.println("2 + 3 = " + result); // Output: 2 + 3 = 5
        result = utils.subtract(10, 4);
        System.out.println("10 - 4 = " + result); // Output: 10 - 4 = 6
    }
}

原文地址:https://blog.csdn.net/zhijiandedaima/article/details/140369835

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!