NativeActivity
NDK 的適用場(chǎng)景官方給出三點(diǎn):
- 平臺(tái)間的 App 移植
- 復(fù)用現(xiàn)有庫(kù)
- 對(duì)軟件性能要求較高的場(chǎng)合比如游戲等
有兩種方式可以實(shí)現(xiàn) native activity。
- native_activity.h
- android_native_app_glue
由于第二種方法啟用另一個(gè)線(xiàn)程處理回調(diào)和輸入事件,NDK 的例子中就采用了這個(gè)實(shí)現(xiàn)方式。
工程初始化
創(chuàng)建 NDK 工程
??
??
NDK 工程創(chuàng)建完成會(huì)生成一個(gè)帶有 JNI 調(diào)用 c++ 返回 HelloWorld 字符串的一個(gè)初始化工程
配置 NativeActivity
首先在? AndroidManifest.xml 文件中添加 Name 為 android.app.lib_name(不可更改) 的 MetaData
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.lib_name" android:value="OpenGLDemo" />
</activity>
將我們 MainActivity 改為繼承?NativeActivity,并加載 native 生成的?OpenGLDemo.so
import android.app.NativeActivity
class MainActivity : NativeActivity() {
companion object {
init {
System.loadLibrary("OpenGLDemo")
}
}
}
?配置 CMakeList 文件
cmake_minimum_required(VERSION 3.22.1)
# 與之前在 Manifest 文件中配置的一樣
project("OpenGLDemo")
# 添加 native_app_glue
set(APP_GLUE_DIR ${ANDROID_NDK}/sources/android/native_app_glue)
include_directories(${APP_GLUE_DIR})
add_library(app-glue STATIC ${APP_GLUE_DIR}/android_native_app_glue.c)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")
# 添加源碼和頭文件
file(GLOB LOCAL_SOURCE "${CMAKE_SOURCE_DIR}/*.cpp")
file(GLOB LOCAL_HEADER "${CMAKE_SOURCE_DIR}/*.h")
add_library(${CMAKE_PROJECT_NAME} SHARED
${LOCAL_HEADERS}
${LOCAL_SOURCE})
# 指定 CMake 應(yīng)鏈接到您的目標(biāo)庫(kù)的庫(kù)
target_link_libraries(${CMAKE_PROJECT_NAME}
android
EGL
GLESv3
jnigraphics
app-glue
log)
創(chuàng)建 main.cpp 的 native 入口文件
#include <android_native_app_glue.h>
#include <jni.h>
static int32_t handle_input(struct android_app* app, AInputEvent* event) {
return 0;
}
static void handle_cmd(struct android_app *app, int32_t cmd) {
switch (cmd) {
case APP_CMD_RESUME: {
break;
}
case APP_CMD_PAUSE: {
break;
}
default:
break;
}
}
void android_main(struct android_app *app) {
app->onAppCmd = handle_cmd;
app->onInputEvent = handle_input;
// 循環(huán)等待要做的事情。
while (!app->destroyRequested) {
int events;
struct android_poll_source *source;
// 獲取需要處理的事件
if (ALooper_pollAll(0, nullptr, &events, (void **) &source) >= 0) {
if (source) {
source->process(app, source);
}
}
}
}
?至此我們的 native 工程就配置完成了,運(yùn)行后你會(huì)看到一個(gè)純黑的窗口,那是因?yàn)槲覀儧](méi)有為當(dāng)前 MainActivity 創(chuàng)建的 Window 繪制任何東西
要想繪制東西,需要初始化 OpenGL?,創(chuàng)建對(duì)應(yīng)的 Display 與 Surface 與當(dāng)前的 window 進(jìn)行綁定
詳見(jiàn)?Android OpenGL 教程——窗口初始化文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-599688.html
OpenGLDemo 源碼的 init_native_activity 分支?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-599688.html
到了這里,關(guān)于Android OpenGL 教程——Native 工程初始化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!