在Android开发中,我们常常会使用JNI (Java Native Interface) 来调用C/C++代码。JNI是Java提供的一种机制,用于在Java代码中调用本地或者C/C++代码。通过使用JNI,我们可以在Android应用中使用底层的C/C++库,以提高性能或者使用一些特定的功能。
本篇博客将介绍如何在Android应用中使用JNI来进行互相传参和返回调用的操作。
1. 准备工作
在开始之前,首先需要准备一些基本的工作:
- 安装C/C++的开发环境:使用JNI需要先安装C/C++的编译环境,如gcc、g++等。
- 创建Android项目:在Android Studio中创建一个新的Android项目,并配置NDK路径。
2. 创建JNI代码
在Android项目中的app
模块下,创建一个新的文件夹jni
,以存放JNI代码。
在jni
文件夹中,创建一个新的C/C++源文件,如native-lib.cpp
,这里使用C++来编写JNI代码。在该文件中,可以编写C/C++的函数,供Java层调用。
#include <jni.h>
extern "C" JNIEXPORT jint JNICALL
Java_com_example_myapp_MainActivity_nativeAdd(JNIEnv* env, jobject /* this */, jint a, jint b) {
return a + b;
}
在上面的代码中,我们定义了一个名为nativeAdd
的函数,用于实现两个整数相加的功能。
3. 编写Java代码
在Android项目中的Java代码中,我们可以通过JNI来调用C/C++的函数。
首先,需要在Java代码中声明JNI函数所在的类和方法。这里以MainActivity为例:
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("native-lib");
}
public native int nativeAdd(int a, int b);
// ...
}
在上面的代码中,我们通过System.loadLibrary("native-lib")
加载了之前定义的JNI库。
然后,我们可以在Java代码中调用JNI函数:
int sum = nativeAdd(5, 3);
System.out.println("Sum: " + sum);
在上面的代码中,我们调用了之前定义的nativeAdd
函数,并输出了结果。
4. NDK构建和运行
在编写完JNI代码和Java代码后,还需要进行一些配置,以便正确地编译和运行。
首先,需要在build.gradle
文件中添加相关的配置:
android {
// ...
defaultConfig {
// ...
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions"
}
}
}
// ...
}
然后,在CMakeLists.txt
文件中添加相关的配置,用于构建JNI库:
cmake_minimum_required(VERSION 3.4.1)
add_library(native-lib SHARED native-lib.cpp)
# Include libraries needed for native-lib lib
target_link_libraries(
native-lib
android
log
)
完成配置后,可以进行NDK构建,生成JNI库。
最后,在运行项目时,会自动加载JNI库,并调用相应的JNI方法。
5. 总结
本篇博客介绍了如何在Android应用中使用JNI进行互相传参和返回调用的操作。通过使用JNI,可以方便地在Java和C/C++之间进行数据传递和函数调用,充分发挥底层库的功能和性能。
如果你对JNI还不是很熟悉,可以多多尝试一些简单的例子,并进一步探索JNI的更多用法。希望这篇博客对你有所帮助,祝你在Android开发中取得更多的成果!
本文来自极简博客,作者:星辰漫步,转载请注明原文链接:Android Native Code JNI互相传参返回调用