在 Android 开发中调用 C/C++ 代码,通常是通过 JNI(Java Native Interface) 或者 NDK(Native Development Kit) 来实现的。大致流程是:
- Java/Kotlin 端声明 native 方法
- 实现对应的 C/C++ 函数
- 编译生成
.so
动态库 - 在 Android 运行时加载该库并调用
1. 在 Java/Kotlin 中声明 native 方法
public class NativeLib {
// 加载本地库
static {
System.loadLibrary("mynative");
}
// 声明 native 方法
public native String stringFromJNI();
}
2. 创建 C/C++ 源码
假设你使用 Android Studio,在 app/src/main/cpp
下新建 native-lib.cpp
:
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_myapp_NativeLib_stringFromJNI(JNIEnv* env, jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
这里的函数名必须符合 JNI 命名规则:
Java_包名_类名_方法名
3. 配置 CMakeLists.txt
Android Studio 会自动生成一个 CMakeLists.txt
,比如:
cmake_minimum_required(VERSION 3.4.1)
add_library( # 库名
mynative
SHARED
native-lib.cpp )
find_library( # log 库
log-lib
log )
target_link_libraries( mynative ${log-lib} )
4. 修改 build.gradle
在 app/build.gradle
中启用 CMake:
android {
defaultConfig {
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
}
}
}
5. 在 Activity 中调用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NativeLib lib = new NativeLib();
String result = lib.stringFromJNI();
Log.d("JNI", "Result: " + result);
}
}
关键点注意
- Java/Kotlin 调用 C/C++ 用 JNI 规范传递数据(基本类型直接传,复杂对象需通过
JNIEnv
访问字段)。 - 如果 C++ 代码复杂,可以使用 NDK + CMake,这样可以直接引入第三方库(Eigen, OpenCV, etc.)。
- Android 默认使用 ARM 架构(arm64-v8a、armeabi-v7a),CMake 会为这些目标生成
.so
。 - 如果是 已有 C++ 项目(比如你的 GNSS 代码),只需要把代码放到
cpp/
下,并在CMakeLists.txt
中add_library
。