目录
[一、先把版本定死!新手别瞎选,全是 RK3576 兼容性最优解](#一、先把版本定死!新手别瞎选,全是 RK3576 兼容性最优解)
[第一步:安装 JDK1.8,配置环境变量](#第一步:安装 JDK1.8,配置环境变量)
[1. 下载安装](#1. 下载安装)
[2. 配置环境变量(Windows)](#2. 配置环境变量(Windows))
[3. 验证安装是否成功](#3. 验证安装是否成功)
[第二步:安装 Android Studio,配置 SDK](#第二步:安装 Android Studio,配置 SDK)
[1. 下载安装](#1. 下载安装)
[2. 首次启动配置,安装必备 SDK](#2. 首次启动配置,安装必备 SDK)
[3. 安装指定版本的 SDK Platform 和工具](#3. 安装指定版本的 SDK Platform 和工具)
[4. 配置安卓环境变量](#4. 配置安卓环境变量)
[第三步:安装 NDK r21e,配置环境变量](#第三步:安装 NDK r21e,配置环境变量)
[方式一:Android Studio SDK Manager 自动安装(新手首选)](#方式一:Android Studio SDK Manager 自动安装(新手首选))
[方式二:手动下载安装(适合 SDK Manager 下载慢的兄弟)](#方式二:手动下载安装(适合 SDK Manager 下载慢的兄弟))
[配置 NDK 环境变量](#配置 NDK 环境变量)
[第四步:RK3576 开发板连接与调试环境准备](#第四步:RK3576 开发板连接与调试环境准备)
[1. 开发板开启 USB 调试](#1. 开发板开启 USB 调试)
[2. 连接电脑,验证 adb 识别](#2. 连接电脑,验证 adb 识别)
[3. RK3576 官方 SDK 目录解析(新手提前了解)](#3. RK3576 官方 SDK 目录解析(新手提前了解))
[三、实战:从零新建第一个 JNI 项目,跑通 Hello World](#三、实战:从零新建第一个 JNI 项目,跑通 Hello World)
[步骤 1:新建 Native C++ 项目](#步骤 1:新建 Native C++ 项目)
[步骤 2:项目目录解析,搞懂每个 JNI 相关文件的作用](#步骤 2:项目目录解析,搞懂每个 JNI 相关文件的作用)
[步骤 3:锁定项目配置,适配 RK3576](#步骤 3:锁定项目配置,适配 RK3576)
[1. 修改 app 模块的 build.gradle](#1. 修改 app 模块的 build.gradle)
[2. 检查 CMakeLists.txt](#2. 检查 CMakeLists.txt)
[步骤 4:代码讲解,逐行搞懂 JNI 调用流程](#步骤 4:代码讲解,逐行搞懂 JNI 调用流程)
[1. Java 层代码:MainActivity.java](#1. Java 层代码:MainActivity.java)
[2. C++ 层代码:native-lib.cpp](#2. C++ 层代码:native-lib.cpp)
[步骤 5:编译运行,跑通第一个 JNI 程序](#步骤 5:编译运行,跑通第一个 JNI 程序)
[四、新手踩坑急救站:90% 的人都会遇到的问题,解决方案全在这](#四、新手踩坑急救站:90% 的人都会遇到的问题,解决方案全在这)
[问题 1:编译报错 NDK not configured. Download it with SDK manager.](#问题 1:编译报错 NDK not configured. Download it with SDK manager.)
[问题 2:运行报错 UnsatisfiedLinkError: No implementation found for xxx](#问题 2:运行报错 UnsatisfiedLinkError: No implementation found for xxx)
[问题 3:安装 APK 报错 INSTALL_FAILED_NO_MATCHING_ABIS](#问题 3:安装 APK 报错 INSTALL_FAILED_NO_MATCHING_ABIS)
[问题 4:adb 连不上 RK3576 开发板](#问题 4:adb 连不上 RK3576 开发板)
[问题 5:CMake 报错 Configuration failed](#问题 5:CMake 报错 Configuration failed)
[本章总结 + 下章预告](#本章总结 + 下章预告)
前言
哈喽各位兄弟们,我是你们的黒漂技术佬!
上一章咱们把 JNI/NDK 的核心概念、RK3576 安卓开发的完整架构讲透了,后台直接炸了,一堆兄弟留言:"佬哥,概念我全懂了,但是环境搭了 3 天,各种报错,NDK 找不到、编译不通过、连不上开发板,直接劝退了!"
懂了懂了!这绝对是新手入门 JNI/NDK 的第一道鬼门关 ------环境搭建。很多教程要么跳步、要么瞎给版本,新手跟着走,一步一个坑,最后直接放弃。尤其是咱们做 RK3576 开发,版本兼容性是命门,NDK 版本选不对、SDK 版本不匹配,后面就算代码写对了,也会各种奇奇怪怪的报错,连官方的 librga、librknn 库都调不动。
今天这一章,佬哥我一步不跳、版本给死、坑全堵死,保姆级带你搭好全套开发环境,从 JDK 安装到跑通第一个运行在 RK3576 开发板上的 JNI 程序,保证你跟着走,100% 能成功,再也不会被环境劝退!
一、先把版本定死!新手别瞎选,全是 RK3576 兼容性最优解
很多新手踩的第一个坑,就是啥都用最新版:最新的 JDK17、最新的 NDK r26、最新的安卓 SDK,结果和 RK3576 的官方固件、原生库完全不兼容,编译报错能给你整到凌晨 3 点。
今天佬哥直接给你们锁死版本,全是我在 RK3576 上踩了无数坑验证过的兼容性最优组合,新手直接抄作业,别自己瞎换!
表格
| 工具 / 环境 | 锁定版本 | 为什么选这个版本 |
|---|---|---|
| JDK | 1.8(JDK8) | 安卓开发黄金版本,RK3576 官方 SDK、安卓 9-12 固件全兼容,高版本 JDK 会有类加载兼容问题 |
| Android Studio | 最新稳定版 | 新版对 NDK、JNI 开发的支持更友好,调试更方便,基础配置我们会手动锁死兼容版本 |
| NDK | r21e | 划重点!瑞芯微 RK3576 官方所有原生库(librga/librknn/mpp)全是用这个版本编译的,兼容性 100%,高版本 NDK 会出现 ABI 不兼容、函数找不到的致命问题 |
| CMake | 3.10.2 | 和 NDK r21e 配套的版本,避免构建脚本不兼容 |
| 安卓 SDK Platform | API 29(安卓 10) | RK3576 官方出厂固件绝大多数是安卓 10/11,API29 是兼容性最好的版本,不会出现 API 适配问题 |
| 目标 ABI | arm64-v8a | RK3576 是 64 位 ARM Cortex-A55 架构,这个 ABI 能完全发挥芯片性能,官方原生库仅提供 arm64-v8a 版本 |
二、分步搭建:一步不跳,跟着点就行
咱们分 Windows 和 Linux 双平台讲解(新手推荐 Windows,RK3576 固件编译推荐 Ubuntu,JNI 开发 Windows 完全够用),每一步都有详细操作,连鼠标点哪里都给你写清楚。
第一步:安装 JDK1.8,配置环境变量
很多新手会说:"Android Studio 自带 JDK,还用装吗?" 答案是:必须单独装一个 JDK1.8,后面用 javah 生成头文件、命令行编译都要用,而且能避免 AS 自带 JDK 和项目版本冲突的坑。
1. 下载安装
- 官网下载地址:Oracle JDK8 (选对应系统的版本,Windows 选 x64 Installer)
- 安装步骤:无脑下一步,安装路径别带中文、别带空格 (比如默认的
Program Files有空格,建议改成D:\Java\jdk1.8.0_xxx),记住这个安装路径,后面配置环境变量要用。
2. 配置环境变量(Windows)
- 右键「此电脑」→「属性」→「高级系统设置」→「环境变量」
- 新建系统变量 :
- 变量名:
JAVA_HOME - 变量值:你的 JDK 安装路径(比如
D:\Java\jdk1.8.0_202)
- 变量名:
- 编辑系统变量里的 Path ,新建两个值:
%JAVA_HOME%\bin%JAVA_HOME%\jre\bin
- 新建系统变量 (可选,避免部分老项目报错):
- 变量名:
CLASSPATH - 变量值:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(前面的点和分号不能丢)
- 变量名:
3. 验证安装是否成功
按下Win+R,输入cmd打开命令行,依次输入以下 3 个命令:
bash
运行
java -version
javac -version
echo %JAVA_HOME%
如果都能正常输出版本号、JAVA_HOME 路径,没有报错,说明 JDK 安装成功!如果提示 "不是内部或外部命令",回去检查环境变量有没有配错。
第二步:安装 Android Studio,配置 SDK
Android Studio 是咱们安卓 + JNI 开发的主力 IDE,别用 Eclipse 了,现在全行业都用 AS,对 NDK 的支持拉满。
1. 下载安装
- 官网下载地址:Android Studio 官网,下载最新稳定版
- 安装步骤:无脑下一步,安装路径同样别带中文、别带空格,组件全选默认就行。
2. 首次启动配置,安装必备 SDK
- 首次启动 AS,会弹出配置向导,选择「Custom」自定义配置
- JDK 选择咱们刚才装的 JDK1.8(别用 AS 自带的,避免冲突)
- 到「SDK Components Setup」这一步,重点配置:
- SDK 安装路径:同样别带中文、别带空格,比如
D:\Android\Sdk,记住这个路径,后面要用来配置ANDROID_HOME - 勾选「Android SDK」「Android SDK Platform」「Android Virtual Device」(模拟器,新手可以先装)
- SDK 安装路径:同样别带中文、别带空格,比如
- 完成安装,进入 AS 主界面。
3. 安装指定版本的 SDK Platform 和工具
- 打开 AS,右上角点击「SDK Manager」图标(就是一个小手机加向下箭头的图标),或者左上角「File」→「Settings」→「Appearance & Behavior」→「System Settings」→「Android SDK」
- 「SDK Platforms」标签页:
- 勾选右下角「Show Package Details」,展开所有版本
- 勾选Android 10.0 (Q) API 29,里面的全选就行
- 可选勾选 Android 11.0 (R) API 30,适配更高版本的 RK3576 固件
- 「SDK Tools」标签页:
- 同样勾选右下角「Show Package Details」,展开所有版本
- 勾选以下工具,版本严格对应:
- Android SDK Build-Tools 29.0.3(和 API29 配套)
- CMake 3.10.2(锁死版本,别选最新的)
- Android SDK Platform-Tools(最新版就行,里面有 adb 工具)
- Android SDK Command-line Tools (latest)(必备命令行工具)
- 点击「Apply」→「OK」,等待下载安装完成,别中途断网!
4. 配置安卓环境变量
和 JDK 一样,咱们要配置安卓的环境变量,后面用 adb、ndk-build 命令都要用:
- 打开系统环境变量,新建系统变量 :
- 变量名:
ANDROID_HOME - 变量值:刚才的 SDK 安装路径(比如
D:\Android\Sdk)
- 变量名:
- 编辑系统变量里的 Path,新建 3 个值:
%ANDROID_HOME%\platform-tools%ANDROID_HOME%\tools%ANDROID_HOME%\cmdline-tools\latest\bin
- 验证:新开 cmd 窗口,输入
adb version,能输出版本号就说明配置成功!
第三步:安装 NDK r21e,配置环境变量
划重点!这是整个环境搭建最核心的一步,版本必须是 r21e,别瞎换!咱们提供两种安装方式,新手推荐第一种,自动安装,不会出错。
方式一:Android Studio SDK Manager 自动安装(新手首选)
- 打开 AS 的「SDK Manager」→「SDK Tools」标签页,勾选「Show Package Details」
- 找到「NDK (Side by side)」,展开,只勾选 21.4.7075529(也就是 r21e),别的版本一律不勾
- 点击「Apply」→「OK」,等待下载完成,AS 会自动把 NDK 安装到 SDK 目录下的
ndk\21.4.7075529文件夹里
方式二:手动下载安装(适合 SDK Manager 下载慢的兄弟)
- 官网下载地址:NDK 历史版本归档,找到「NDK r21e」,下载对应系统的版本
- 解压到 SDK 目录下,比如
D:\Android\Sdk\ndk\r21e,路径别带中文、空格 - 打开 AS,左上角「File」→「Project Structure」→「SDK Location」,在「Android NDK location」里选择你刚才解压的 NDK 路径,点击 OK
配置 NDK 环境变量
- 打开系统环境变量,新建系统变量 :
- 变量名:
NDK_PATH - 变量值:NDK 的安装路径(比如
D:\Android\Sdk\ndk\21.4.7075529)
- 变量名:
- 编辑系统变量里的 Path,新建一个值:
%NDK_PATH% - 验证:新开 cmd 窗口,输入
ndk-build -version,能输出版本号就说明配置成功!
第四步:RK3576 开发板连接与调试环境准备
咱们的 JNI 程序最终要跑在 RK3576 开发板上,所以必须先把开发板和电脑连好,adb 能正常识别。
1. 开发板开启 USB 调试
- 给 RK3576 开发板上电,开机进入安卓系统,连接显示器
- 打开「设置」→「关于平板电脑」→ 连续点击「版本号」7 次,开启开发者模式
- 返回设置主页,打开「开发者选项」,勾选「USB 调试」、「保持唤醒状态」,关闭「权限监控」(避免后面访问硬件节点权限不足)
2. 连接电脑,验证 adb 识别
- 用 Type-C 数据线,把 RK3576 开发板的 OTG 口和电脑的 USB 口连起来
- 开发板上会弹出「允许 USB 调试吗?」的弹窗,勾选「始终允许来自这台计算机」,点击确定
- 电脑新开 cmd 窗口,输入
adb devices,如果输出类似下面的内容,说明连接成功!
bash
运行
List of devices attached
0123456789ABCDEF device
如果没识别到,检查数据线是不是 OTG 线、USB 调试有没有开、驱动有没有装(Windows 需要装瑞芯微 ADB 驱动,官网能下)。
3. RK3576 官方 SDK 目录解析(新手提前了解)
如果你的电脑已经下载了 RK3576 的官方安卓 SDK,这里提前给你讲透和咱们 JNI 开发相关的核心目录,后面几章会反复用到:
plaintext
rk3576_android_sdk/
├── device/rockchip/ # 瑞芯微设备配置,固件编译参数、权限配置
├── hardware/rockchip/ # 重点!官方原生库全在这里
│ ├── librga/ # 2D硬件加速库,后面章节会讲
│ ├── librknn_api/ # NPU推理库,AI相关
│ ├── mpp/ # 视频编解码库
│ └── camera/ # 摄像头相关库
├── kernel/ # Linux内核,驱动相关
├── out/ # 编译输出目录,固件、so库都在这里
└── prebuilts/ # 预编译工具链,交叉编译用
新手现在不用急着编译整个 SDK,咱们先把 JNI 基础打牢,后面用到官方库的时候,直接从这里拷贝头文件和 so 库就行。
三、实战:从零新建第一个 JNI 项目,跑通 Hello World
环境搭好了,咱们直接上手,新建第一个 JNI 项目,让 Java 通过 JNI 调用 C++ 代码,在 RK3576 开发板的屏幕上显示结果,彻底打通整个流程。
步骤 1:新建 Native C++ 项目
- 打开 Android Studio,点击「New Project」
- 拉到最下面,选择 **Native C++** 模板(划重点!别选 Empty Activity,这个模板会自动帮我们配置好 JNI 相关的所有基础文件,新手不用自己手动配),点击 Next
- 配置项目基本信息:
- Name:项目名,比如
RK3576_JNI_HelloWorld - Package name:包名,比如
com.heipiao.rk3576.jni(别带中文、特殊字符) - Save location:项目保存路径,别带中文、空格
- Language:选 Java(新手先学 Java,后面再讲 Kotlin)
- Minimum SDK:选API 29: Android 10.0 (Q),和咱们之前的 SDK 版本对应
- 点击 Next
- Name:项目名,比如
- 选择 C++ 标准:
- 直接选C++11,别选更高的,和 RK3576 官方库的编译标准保持一致,避免兼容问题
- 别勾选「Exceptions Support」和「Runtime Type Information Support」,新手用不到
- 点击 Finish,等待项目初始化完成,别中途打断!
步骤 2:项目目录解析,搞懂每个 JNI 相关文件的作用
项目创建完成后,咱们先把目录结构搞懂,对应上一章讲的安卓分层架构,知道每个文件是干嘛的,再也不会两眼一抹黑。
重点关注这 3 个核心部分:
plaintext
RK3576_JNI_HelloWorld/
├── app/src/main/
│ ├── java/com/heipiao/rk3576/jni/
│ │ └── MainActivity.java # 应用层,Java代码,定义native方法
│ ├── cpp/
│ │ ├── native-lib.cpp # 原生层,C++代码,实现JNI函数
│ │ └── CMakeLists.txt # NDK构建脚本,配置so库编译规则
│ └── res/ # 布局文件,界面相关
└── build.gradle # 项目配置,重点配置ABI和NDK
咱们逐文件拆解,大白话讲透:
- MainActivity.java:对应上一章的「应用层」,咱们在这里定义 native 方法,加载 C++ 编译出来的 so 库,调用 C++ 的函数,把结果显示到屏幕上。
- native-lib.cpp:对应上一章的「原生层」,咱们在这里写 C++ 代码,实现 JNI 函数,处理具体逻辑,给 Java 层提供调用入口。
- CMakeLists.txt:NDK 的构建配置文件,告诉编译器怎么编译 C++ 代码、生成什么名字的 so 库、链接哪些系统库,对应上一章讲的 NDK 构建系统。
- build.gradle:APP 的构建配置,咱们在这里指定 NDK 版本、目标 ABI(arm64-v8a),和 RK3576 的架构匹配。
步骤 3:锁定项目配置,适配 RK3576
项目自动生成的配置,咱们要手动修改几个地方,完全适配 RK3576,避免后面踩坑。
1. 修改 app 模块的 build.gradle
打开app/build.gradle文件,修改成下面的配置,重点看注释的地方:
gradle
plugins {
id 'com.android.application'
}
android {
namespace 'com.heipiao.rk3576.jni'
compileSdk 29 // 锁死SDK版本29,和之前的配置一致
defaultConfig {
applicationId "com.heipiao.rk3576.jni"
minSdk 29
targetSdk 29 // 锁死targetSdk29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// 重点!NDK配置,锁死版本r21e
ndk {
// 只编译arm64-v8a架构的so库,完全适配RK3576
abiFilters 'arm64-v8a'
}
// 重点!指定CMake的构建配置
externalNativeBuild {
cmake {
cppFlags "-std=c++11" // 锁死C++11标准
arguments "-DANDROID_STL=c++_static"
}
}
}
// 重点!指定NDK路径,和咱们之前安装的r21e对应
ndkVersion '21.4.7075529'
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// CMakeLists.txt的路径
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.10.2' // 锁死CMake版本
}
}
}
dependencies {
// 自动生成的依赖,不用改
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
修改完成后,点击右上角的「Sync Now」,等待同步完成,没有报错就说明配置成功!
2. 检查 CMakeLists.txt
打开app/src/main/cpp/CMakeLists.txt,自动生成的内容基本不用改,咱们给每一行加上注释,让你搞懂每一行是干嘛的:
cmake
# 指定CMake的最低版本,和咱们配置的3.10.2一致
cmake_minimum_required(VERSION 3.10.2)
# 项目名称,随便起,一般和so库名一致
project("rk3576_jni_helloworld")
# 重点:添加动态库,生成so文件
# 第一个参数:so库的名字,比如这里叫native-lib,生成的so文件就是libnative-lib.so
# 第二个参数:SHARED,动态库(安卓里只用动态库)
# 第三个参数:C++源文件的路径,所有要编译的cpp文件都要写在这里
add_library(
native-lib
SHARED
native-lib.cpp)
# 找到安卓系统的log库,用来在C++里打印日志,和Java的Log一样
find_library(
log-lib
log)
# 把系统库链接到咱们的so库,不然用不了系统的API
target_link_libraries(
native-lib
${log-lib})
步骤 4:代码讲解,逐行搞懂 JNI 调用流程
咱们不用改自动生成的代码,先把每一行的逻辑搞懂,对应上一章的 JNI 概念,彻底搞明白 Java 是怎么调用 C++ 的。
1. Java 层代码:MainActivity.java
java
运行
package com.heipiao.rk3576.jni;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.heipiao.rk3576.jni.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
// 1. 应用启动时,加载咱们编译好的libnative-lib.so库
// 划重点:这里的库名,要和CMakeLists.txt里add_library的第一个参数完全一致
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 界面绑定,不用管
ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
TextView tv = binding.sampleText;
// 3. 调用native方法,拿到C++返回的字符串,显示到屏幕上
tv.setText(stringFromJNI());
}
// 2. 定义native方法,用native关键字修饰
// 这个方法的实现在C++层,Java层只需要定义,就能调用
public native String stringFromJNI();
}
2. C++ 层代码:native-lib.cpp
cpp
运行
#include <jni.h>
#include <string>
// 重点:JNI函数的命名规则,必须严格遵守,不然Java找不到对应的函数
// 规则:Java_包名_类名_方法名,包名里的点要换成下划线
// 这里的Java_com_heipiao_rk3576_jni_MainActivity_stringFromJNI
// 对应Java层的com.heipiao.rk3576.jni.MainActivity类里的stringFromJNI方法
extern "C" JNIEXPORT jstring JNICALL
Java_com_heipiao_rk3576_jni_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
// 定义C++的字符串
std::string hello = "Hello from C++ | 黒漂技术佬-RK3576 JNI系列";
// 把C++的字符串,转换成Java能识别的jstring类型,返回给Java层
// 这里就是JNI的核心作用:数据类型转换,翻译官的本职工作
return env->NewStringUTF(hello.c_str());
}
划重点!这里的extern "C"必须加,不然 C++ 的函数名会被编译器修改,Java 就找不到对应的函数了,新手 100% 会踩这个坑!
步骤 5:编译运行,跑通第一个 JNI 程序
- 确保你的 RK3576 开发板已经通过 adb 连接到电脑,
adb devices能看到设备 - Android Studio 右上角,选择你的 RK3576 开发板设备,别选模拟器
- 点击右边的绿色三角形「Run 'app'」按钮,等待编译、安装、运行
- 如果一切正常,你的 RK3576 开发板的屏幕上,会显示出咱们 C++ 代码里写的字符串:
Hello from C++ | 黒漂技术佬-RK3576 JNI系列
恭喜你!到这里,你已经成功跑通了第一个运行在 RK3576 上的 JNI 程序,彻底打通了 Java→JNI→C++ 的完整流程,JNI/NDK 开发的大门,已经正式为你打开了!
四、新手踩坑急救站:90% 的人都会遇到的问题,解决方案全在这
佬哥我把新手环境搭建、第一个项目里 100% 会遇到的问题,全整理出来了,遇到报错直接来这里找解决方案,不用到处百度。
问题 1:编译报错 NDK not configured. Download it with SDK manager.
原因 :NDK 版本没锁死,AS 找不到对应的 NDK 路径解决方案:
- 检查
app/build.gradle里有没有写ndkVersion '21.4.7075529' - 检查 SDK Manager 里是不是真的安装了 NDK r21e
- 打开「File」→「Project Structure」→「SDK Location」,确认 NDK 路径是对的
问题 2:运行报错 UnsatisfiedLinkError: No implementation found for xxx
原因 :Java 找不到对应的 JNI 函数,99% 是函数名写错了,或者没加extern "C"解决方案:
- 检查 C++ 里的函数名,是不是严格遵守
Java_包名_类名_方法名的规则,包名的点换成下划线 - 检查函数前面有没有加
extern "C",必须加! - 检查
System.loadLibrary("native-lib")里的库名,和 CMakeLists.txt 里的是不是完全一致
问题 3:安装 APK 报错 INSTALL_FAILED_NO_MATCHING_ABIS
原因 :编译的 so 库架构,和 RK3576 的 arm64-v8a 架构不匹配解决方案:
- 检查
app/build.gradle里的abiFilters 'arm64-v8a'有没有写对 - 别加别的 ABI,比如 armeabi-v7a、x86,只留 arm64-v8a
问题 4:adb 连不上 RK3576 开发板
解决方案:
- 换一根 OTG 数据线,很多普通充电线只能充电,不能传数据
- 检查开发板的 USB 调试有没有开,重新开关一次开发者选项
- Windows 系统安装瑞芯微官方的 ADB 驱动
- 重启 adb 服务:cmd 里依次输入
adb kill-server→adb start-server→adb devices
问题 5:CMake 报错 Configuration failed
原因 :CMake 版本和 NDK 版本不匹配解决方案:
- 锁死 CMake 版本 3.10.2,NDK 版本 r21e,别用最新版
- 检查 SDK Manager 里是不是真的安装了 CMake 3.10.2
本章总结 + 下章预告
【本章总结】
今天这一章,咱们彻底搞定了 JNI/NDK 开发的环境搭建,核心就 3 件事:
- 锁死了所有工具的版本,全是 RK3576 兼容性最优解,新手直接抄作业,避免 90% 的兼容坑
- 一步不跳地搭好了 JDK、Android Studio、SDK、NDK 全套环境,配置好了 RK3576 开发板的 adb 调试
- 从零新建了第一个 JNI 项目,跑通了 Java 调用 C++ 的完整流程,搞懂了 JNI 函数的命名规则、so 库的编译加载逻辑
【下章预告】
下一章,咱们正式进入 JNI 核心语法的学习,也就是系列规划的第三章:JNI 核心语法(上):数据类型映射与方法调用。我会给你讲透 Java 和 C++ 之间的所有数据类型对应关系、方法签名的生成与使用、Java 调用 C++ 的完整规范,带你写多个实战 demo,彻底搞懂 JNI 的交互规则,再也不会被数据类型转换搞懵!
我是黒漂技术佬,专注给小白搞懂 RK3576 安卓底层、JNI/NDK、嵌入式开发的保姆级教程,跟着我,保证你不迷路、不踩坑!
兄弟们,跟着本章跑通第一个 JNI 程序的,麻烦评论区扣个「RK3576 JNI 入门成功」!有啥问题、踩了啥坑,评论区直接留言,佬哥我挨个回复!点赞收藏关注不迷路,咱们下一章见!