android 表面,扩展,实例都创建成功

This commit is contained in:
xsl
2025-10-18 17:57:55 +08:00
parent 966382a7dd
commit 2db7194305
8 changed files with 165 additions and 33 deletions
+3
View File
@@ -2,6 +2,9 @@ plugins {
alias(libs.plugins.android.application)
}
ext.vvl_version='1.4.321.0'
apply from: "./download_vvl.gradle"
android {
namespace 'com.hmwl.sample'
compileSdk 35
+81
View File
@@ -0,0 +1,81 @@
apply plugin: 'com.android.application'
/*
* Copyright (c) 2022-2024, The Android Open Source Project.
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 the "License";
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/*
* Download validation layer binary release zip file from Khronos github repo
* https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases
*
* To use this script, add the following to your module's build.gradle:
* ext.vvl_version='your-new-version'
* apply from: "${PATH-TO-THIS}/download_vvl.gradle"
* To update to a new version:
* - change the ext.vvl_version to a new version string.
* - delete directory pointed by ${VVL_JNILIB_DIR}.
* - sync gradle script in IDE and rebuild project.
*
* Note: binary release can also be manually downloaded and put it into
* the default jniLibs directory at app/src/main/jniLibs.
*/
// get the validation layer version.
def VVL_VER = "1.4.321.0"
if (ext.has("vvl_version")) {
VVL_VER = ext.vvl_version
}
// declare local variables shared between downloading and unzipping.
def VVL_SITE ="https://github.com/KhronosGroup/Vulkan-ValidationLayers"
def VVL_LIB_ROOT= rootDir.absolutePath.toString() + "/layerLib"
def VVL_JNILIB_DIR="${VVL_LIB_ROOT}/jniLibs"
def VVL_SO_NAME = "libVkLayer_khronos_validation.so"
// download the release zip file to ${VVL_LIB_ROOT}/
task download {
def VVL_ZIP_NAME = "releases/download/vulkan-sdk-${VVL_VER}/android-binaries-${VVL_VER}.zip"
mkdir "${VVL_LIB_ROOT}"
def f = new File("${VVL_LIB_ROOT}/android-binaries-${VVL_VER}.zip")
new URL("${VVL_SITE}/${VVL_ZIP_NAME}")
.withInputStream { i -> f.withOutputStream { it << i } }
}
// unzip the downloaded VVL zip archive to the ${VVL_JNILIB_DIR} for APK packaging.
task unzip(dependsOn: download, type: Copy) {
from zipTree(file("${VVL_LIB_ROOT}/android-binaries-${VVL_VER}.zip"))
into file("${VVL_JNILIB_DIR}")
}
android.sourceSets.main.jniLibs {
srcDirs += ["${VVL_JNILIB_DIR}/android-binaries-${VVL_VER}"]
}
// add vvl download as an application dependency.
dependencies {
def ARM64_VVL_FILE = "${VVL_JNILIB_DIR}/arm64-v8a/${VVL_SO_NAME}"
if(!file("${ARM64_VVL_FILE}").exists()) {
implementation files("${ARM64_VVL_FILE}") {
builtBy 'unzip'
}
}
}
project.afterEvaluate{
project.getTasks().getByName("mergeDebugJniLibFolders").dependsOn(unzip)
project.getTasks().getByName("mergeReleaseJniLibFolders").dependsOn(unzip)
}
+20 -10
View File
@@ -3,14 +3,21 @@
#include <game-activity/native_app_glue/android_native_app_glue.h>
#include <game-activity/GameActivity.h>
#include "AndroidOut.h"
#include "Application.h"
#include <chrono>
#include <thread>
using namespace std;
extern "C" {
android_app* g_android_app = nullptr;
Application* g_Application = nullptr;
void handle_cmd(android_app *pApp, int32_t cmd) {
switch (cmd) {
case APP_CMD_INIT_WINDOW:
aout << "APP_CMD_INIT_WINDOW" << std::endl;
g_Application->initVulkan();
break;
case APP_CMD_TERM_WINDOW:
aout << "APP_CMD_TERM_WINDOW" << std::endl;
@@ -20,26 +27,24 @@ void handle_cmd(android_app *pApp, int32_t cmd) {
}
}
android_app* g_android_app = nullptr;
void android_main(struct android_app *pApp) {
aout << "Welcome to android_main" << std::endl;
g_android_app = pApp;
Application application;
g_Application = &application;
pApp->onAppCmd = handle_cmd;
android_app_set_motion_event_filter(pApp, nullptr);
// This sets up a typical game/event loop. It will run until the app is destroyed.
do {
auto ms = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count();
// Process all pending events before running game logic.
bool done = false;
while (!done) {
// 0 is non-blocking.
int timeout = 0;
int events;
android_poll_source *pSource;
int result = ALooper_pollOnce(timeout, nullptr, &events,
reinterpret_cast<void**>(&pSource));
int result = ALooper_pollOnce(timeout, nullptr, &events, reinterpret_cast<void**>(&pSource));
switch (result) {
case ALOOPER_POLL_TIMEOUT:
[[clang::fallthrough]];
@@ -58,8 +63,13 @@ void android_main(struct android_app *pApp) {
}
}
}
if(application.isInited())
{
application.drawFrame();
}
auto end_ms = chrono::duration_cast<chrono::milliseconds>(chrono::system_clock::now().time_since_epoch()).count();
this_thread::sleep_for(chrono::milliseconds((end_ms-ms)));
} while (!pApp->destroyRequested);
application.cleanup();
}
}