伙计们! 我想使用 raylib 在 C 中创建一个简单的 HelloWorld apk。
我的项目结构:
HelloWorld/
├── CMakeLists.txt
├── src/
│ ├── main.c
├── android/
│ └── AndroidManifest.xml
└── build/
src/main.c:
#include <raylib.h>
int main(void) {
InitWindow(800, 600, "My App");
while (!WindowShouldClose()) {
BeginDrawing();
ClearBackground(RAYWHITE);
DrawText("Hello, World!", 190, 200, 20, LIGHTGRAY);
EndDrawing();
}
CloseWindow();
}
CMakeLists.txt:
# Minimun version of CMake required to build the project
cmake_minimum_required(VERSION 3.5)
# Define the project name
project(HelloWorld)
# Specify the path of raylib headers
include_directories($ENV{RAYLIB_ANDROID}/include)
# Compile C code into a shared library
add_library(hello_world SHARED src/main.c)
# Import raylib
add_library(raylib STATIC IMPORTED)
# Specify the path of raylib
set_target_properties(raylib PROPERTIES IMPORTED_LOCATION $ENV{RAYLIB_ANDROID}/lib/arm64/libraylib.a)
# Link with necessary libraries
target_link_libraries(hello_world raylib android log EGL GLESv2)
android/AndroidManifest.txt:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.oussamateyib.helloworld"
android:versionCode="1"
android:versionName="1.0.0">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="35" />
<application android:label="Hello World">
<activity android:name="android.app.NativeActivity"
android:label="Hello World"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true">
<meta-data android:name="android.app.lib_name" android:value="hello_world" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
在
build/
中:
我跑:
cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK_HOME%\build\cmake\android.toolchain.cmake -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-35 ..
make
-->
libhello_world.so
已成功生成,我将其复制到子目录lib/arm64-v8a
。
然后我跑:
aapt package -f -m -F HelloWorld-temp.apk -M ../android/AndroidManifest.xml -I %ANDROID_HOME%/platforms/android-35/android.jar
aapt add HelloWorld-temp.apk lib/arm64-v8a/libhello_world.so
--> apk打包成功
然后我跑:
zipalign -v 4 HelloWorld-temp.apk
HelloWorld.apk
--> apk 对齐成功
然后我跑:
apksigner sign --ks my-key.jks --ks-key-alias HelloWorld HelloWorld.apk
--> apk 已使用我之前生成的密钥成功签名。
然后我运行(通过 USB 连接我的手机):
adb install HelloWorld.apk
输出:
Performing Incremental Install
Serving...
All files should be loaded. Notifying the device.
Failure [INSTALL_FAILED_INVALID_APK: Scanning Failed.: Package /data/app/~~KjqkABJbYD3SKFrJm_qwcQ==/com.oussamateyib.helloworld-rmQUIQxHLXKSuzm4eo3fuw==/base.apk code is missing]
--> ???
有什么想法吗? 注意:我的手机abi确实是
arm64-v8a
。
您的 AndroidManifest.xml 缺少一个重要条目:
android:hasCode
。对于不包含 DEX 代码的 APK 文件(因此没有 classes.dex
文件),您必须在 android:hasCode="false"
中的 <application>
标签中设置 AndroidManifest.xml
。
应用程序是否包含任何DEX代码——即使用 Kotlin 或 Java 编程语言。如果确实如此,则为“true”并且 如果不是,则为“假”。当值为“false”时,系统不会尝试 启动组件时加载任何应用程序代码。默认值 是“真”。如果应用程序包含本机 (C/C++) 代码,但没有 DEX 代码,这应该设置为“false”。如果设置为“true”时APK 不包含 DEX 代码,应用程序可能无法加载。
https://developer.android.com/guide/topics/manifest/application-element#code