C++封装成Jni库的详细步骤
时间: 2024-01-15 15:04:54 浏览: 102
C++库封装JNI接口-实现java调用c++
好的,下面是详细的步骤:
1. 准备工作
在开始之前,需要确保系统中已经安装了 JDK 和 Android NDK,并且已经配置好了环境变量。
2. 创建 C++ 库文件
在任意目录下创建一个 C++ 文件,例如 `native-lib.cpp`,并编写相应的 C++ 代码。
3. 创建 JNI 接口函数
在 C++ 文件中创建 JNI 接口函数,例如:
```c++
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_com_example_NativeUtils_getMessage(JNIEnv *env, jobject thiz) {
const char *message = "Hello from C++!";
return env->NewStringUTF(message);
}
#ifdef __cplusplus
}
#endif
```
其中,`Java_com_example_NativeUtils_getMessage` 是 JNI 接口函数,`getMessage` 是 Java 层调用的方法名,`com_example_NativeUtils` 是 Java 类的全限定名。
4. 编译 C++ 库文件
使用 NDK 自带的工具链将 C++ 文件编译成动态链接库,例如:
```shell
gcc -shared -fpic -o libnative-lib.so native-lib.cpp
```
其中,`-shared` 选项表示编译成动态链接库,`-fpic` 表示编译为位置独立代码,`-o` 指定输出文件名。
5. 创建 Java 类
在 Android Studio 中创建一个 Java 类,例如:
```java
public class NativeUtils {
static {
System.loadLibrary("native-lib");
}
public static native String getMessage();
}
```
其中,`loadLibrary` 方法用于加载本地库,`getMessage` 方法对应本地方法。
6. 生成头文件
使用 JDK 自带的工具 javah 生成 JNI 头文件,例如:
```shell
javah -classpath <项目路径>/app/build/intermediates/classes/debug -d <jni头文件输出路径> com.example.NativeUtils
```
其中,`<项目路径>` 表示项目的绝对路径,`<jni头文件输出路径>` 表示 JNI 头文件的输出路径,`com.example.NativeUtils` 表示 Java 类的全限定名。
7. 实现 JNI 接口函数
在 JNI 头文件中实现 JNI 接口函数,例如:
```c++
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_NativeUtils_getMessage(JNIEnv *env, jclass clazz) {
const char *message = "Hello from C++!";
return env->NewStringUTF(message);
}
```
其中,`Java_com_example_NativeUtils_getMessage` 是 JNI 接口函数,`getMessage` 是 Java 层调用的方法名,`com_example_NativeUtils` 是 Java 类的全限定名。
需要注意的是,JNI 接口函数的第一个参数是 `JNIEnv` 指针,第二个参数是 `jclass` 或 `jobject` 指针,分别表示当前调用的 Java 类或 Java 对象。
8. 将 JNI 库文件加入 Android 项目
将编译好的动态链接库文件复制到 Android 项目的 `app/src/main/jniLibs/<架构>` 目录下,其中 `<架构>` 表示目标设备的架构,例如 `arm64-v8a`。
9. 在 Android 项目中调用 JNI 方法
在 Android 项目中调用 JNI 方法,例如:
```java
String message = NativeUtils.getMessage();
```
10. 编译运行 Android 项目
编译并运行 Android 项目,即可在应用中使用 C++ 封装的 JNI 接口函数。
阅读全文