使用 Kanzi Android framework (droidfw) 项目进行工作

在 Kanzi Studio 中创建一个 Android 应用程序。

在 Kanzi Studio New Project 窗口中:

  1. 将 Template 设置为您要用于 Android 应用程序的模板:

  2. (可选) 将 Android Package Name 设置为项目的 Android 包名称。

    ../../../_images/new-project-android-application.png
  3. 单击 Create。

    Kanzi Studio 在您在 Location 中的 New Project 窗口中设置的项目目录中创建一个项目,并在 <ProjectName>/Application/configs/platforms/android_gradle 目录中创建一个 Android 应用程序项目。

要了解如何构建和部署您的应用程序,请参阅 将 Kanzi 应用程序部署到 Android。

将 Kanzi Android framework (droidfw) 添加到现有的 Android 应用程序中。

此过程假设您的 Android 应用程序项目使用默认目录结构。

要将 Kanzi Android framework (droidfw) 添加到现有的 Android 应用程序中:

  1. 将您的 Kanzi Studio 项目的 <ProjectName>/Application/bin 目录的内容复制到您的 Android Studio 项目的 app/src/main/assets 目录。

    这样就将您的 kzb 文件导入到 Android 软件包中。

  2. 将 cmake 引入到您的项目中。这样,您可以将本机 Kanzi Engine 插件链接到您的应用程序。

    1. 添加到 app/src/main/cpp/CMakeLists.txt 文件:

      cmake_minimum_required(VERSION 3.10.0)
      project(<ProjectName>)
      
      if(NOT KANZI_ENGINE_BUILD)
          find_package(Kanzi REQUIRED CONFIG CMAKE_FIND_ROOT_PATH_BOTH
              HINTS "$ENV{KANZI_HOME}/Engine/lib/cmake")
      endif()
      
      include(kanzi-common)
      
      add_executable(<ProjectName>
                            # This file is only needed because cmake does not allow an executable without any sources.
                            <ProjectName>.cpp)
      
      target_link_libraries(<ProjectName> -Wl,--whole-archive Kanzi::kzdroidfw -Wl,--no-whole-archive)
      
      target_link_libraries(<ProjectName> Kanzi::kzui Kanzi::kzcoreui Kanzi::kzjava Kanzi::kzinterop)
      
      target_link_font_engine_backends(<ProjectName>)
      
      set_target_properties(<ProjectName> PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}/bin")
      set_target_properties(<ProjectName> PROPERTIES VS_DEBUGGER_ENVIRONMENT "${KANZI_VS_DEBUGGER_ENVIRONMENT}")
      
      install_kanzi_libs_to_output_directory()
      install_kzbs_to_output_directory(${CMAKE_SOURCE_DIR}/bin)
      install_target_to_output_directory(<ProjectName>)
      
    2. 在 app/src/main/cpp 目录中添加一个空的 <ProjectName>.cpp 文件。

  3. 将 getkanzi.gradle 文件从 <KanziWorkspace>/Templates/Android_application_template/Application/configs/platforms/android_gradle 目录复制到您的 Android 项目根目录。

    Gradle 使用 getkanzi.gradle 文件来找到 Kanzi Engine 和 Kanzi Gradle 插件。

  4. 在 Android 项目根目录的 build.gradle 文件中,获取 Kanzi Gradle 插件并添加 Kanzi 作为依赖项:

    buildscript {
        apply from: 'getkanzi.gradle'
    
        repositories {
            google()
            mavenCentral()
            flatDir { dirs getKanziPlugins().toString() }
        }
    
        dependencies {
              classpath "com.android.tools.build:gradle:7.4.2"
              classpath "com.rightware.gradle:kanzi:0.8.1"
        }
    
  5. 在您的 Android Studio 项目的 app/build.gradle 文件中,添加 Kanzi Gradle 插件,并导入 Kanzi Android framework (droidfw) 及其依赖项:

    apply plugin: 'com.rightware.gradle.kanzi'
    ...
    
    android {
        ...
    
        defaultConfig {
          ...
    
            externalNativeBuild {
                cmake {
                    arguments "-DKANZI_LINK_FREETYPE=ON"
                    arguments "-DKANZI_LINK_ITYPE=OFF"
                }
            }
        }
        ...
    
        externalNativeBuild {
            cmake {
                path file('src/main/cpp/CMakeLists.txt')
            }
        }
    }
    ...
    
    kanzi {
        appFramework 'kanziruntime-droidfw'
    }
    
    dependencies {
        ...
        implementation 'com.rightware.kanzi:kzjava@aar'
    }
    
  6. 在您的 Android Studio 项目的 app/build.gradle 文件中,确保将 Java 语言版本设置为 8 (1.8) 或更高:

    android {
        ...
    
        compileOptions {
           sourceCompatibility JavaVersion.VERSION_1_8
           targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    

从自定义位置加载 kzb 文件

默认情况下,Kanzi 从 APK 的 assets 目录中读取 kzb 文件。

要设置不同的位置,请调用 KanziRuntime.setResourceDirectory。

在此调用之后,Kanzi 从应用程序的所有视图中指定的位置读取 kzb 文件。

例如,要从外部存储目录加载 kzb 文件:

mRuntimeRef.get().setResourceDirectory(Environment.getExternalStorageDirectory().toPath());

要恢复到默认位置,请使用空字符串调用接口。