纯C++开发Android应用:ndk-build仅生成.so未生成APK怎么办?
问题原因与解决步骤
核心问题
ndk-build 本身仅负责编译原生C++代码生成 .so 库,它不会自动生成APK。官方指南里提到的“自动打包进APK”,是指当你具备完整的Android项目结构(包含Manifest配置、资源文件等),并配合Gradle这类Android构建工具时,ndk-build产出的.so会被构建工具自动打包进最终APK——而非ndk-build单独完成APK生成。
你的情况是只有jni/目录下的原生代码和构建脚本,缺少Android应用必需的基础结构,所以只能得到.so文件。
具体解决步骤
1. 修正构建脚本配置位置
你把APP_PLATFORM写在了Android.mk里,这个配置属于全局项目级参数,应该放在jni/Application.mk文件中(没有就新建):
# jni/Application.mk APP_PLATFORM := android-30 APP_MODULES := Test # 指定要编译的模块名,对应Android.mk里的LOCAL_MODULE
原Android.mk中删除APP_PLATFORM := android-30,保持如下即可:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := Test LOCAL_SRC_FILES := main.cpp include $(BUILD_SHARED_LIBRARY)
2. 补全Android项目基础结构
在项目根目录下创建以下必备文件和目录:
- AndroidManifest.xml:应用的核心配置文件,若做纯Native应用(无需Java代码),可使用
NativeActivity,示例如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yourcompany.test"> <!-- 替换成你的自定义包名 --> <application android:label="TestApp" android:icon="@mipmap/ic_launcher"> <!-- 可自行添加图标资源,或暂时留空 --> <activity android:name="android.app.NativeActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- 指定要加载的.so库名,对应LOCAL_MODULE的Test --> <meta-data android:name="android.app.lib_name" android:value="Test" /> </activity> </application> <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" /> </manifest>
- res/目录:至少创建空的
res/mipmap/和res/values/目录,避免构建时因缺少资源目录报错。
3. 生成APK
新手最推荐用Android Studio导入项目完成打包:
- 打开Android Studio,选择“Import Project”,选中你的项目根目录
- Studio会自动生成Gradle构建配置,识别
jni/目录的原生代码 - 点击工具栏的「Build」→「Build Bundle(s)/APK(s)」→「Build APK(s)」,最终APK会生成在
app/build/outputs/apk/目录下
如果想用命令行打包,需要使用aapt、d8、apksigner等Android构建工具链,步骤繁琐,不推荐新手尝试。
内容的提问来源于stack exchange,提问作者user21907176
相关产品推荐
相关产品推荐

