使用 Kanzi application framework (appfw) 开发 Android 应用程序。¶
当您想要为多个平台创建应用程序并打算在这些平台之间共享重要的应用程序代码时,使用 Kanzi application framework (appfw)。
Kanzi application framework (appfw) 是一个用于开发跨平台应用程序的框架。您可以用 C++ 编写应用程序和插件代码,扩展 Android 特定功能需要编写 JNI glue 代码。使用 Kanzi application framework (appfw) 时,您只能在一个 Android View 上渲染一个 Kanzi 应用程序。
Kanzi 应用程序中的 Android 生命周期事件¶
Android 生命周期事件设置 Kanzi 应用程序在活动状态更改时的行为方式。每个事件都对应一个 Android 活动回调方法。Kanzi 应用程序使用以下生命周期事件:
Lifecycle.Event.ON_CREATE// Load the native library that provides Kanzi functionality, // initialize the context, and assign the KanziView for rendering. // This function calls the KanziNativeLibrary.createApplication() function, // which loads the Kanzi project. KanziView.createNativeApplication();
Lifecycle.Event.ON_DESTROY// Halt and destroy the Kanzi application. // This function calls the KanziNativeLibrary.haltApplication() and // KanziNativeLibrary.destroyApplication() functions. KanziView.destroyNativeApplication();
SurfaceHolder.Callback.surfaceCreated(KanziView.surfaceCreated)// When the application surface is created, run the Kanzi application. KanziNativeLibrary.runApplication(holder.getSurface());
SurfaceHolder.Callback.surfaceDestroyed(KanziView.surfaceDestroyed)// When the Kanzi application surface is destroyed, pause rendering. KanziNativeLibrary.haltApplication();
SurfaceHolder.Callback.surfaceChanged(KanziView.surfaceChanged)// When the format or size of the Kanzi application surface changes, // resize the application surface. // @param width: The new width of the surface. // @param height: The new height of the surface. KanziNativeLibrary.resizeEvent(width, height);
Kanzi 不使用 LifeCycle.Event.ON_PAUSE 和 Lifecycle.Event.ON_RESUME 事件,因为这两个事件不告知应用程序图面是否准备好渲染。为暂停和恢复渲染,KanziView 使用以下函数:
SurfaceHolder.Callback.surfaceCreated(KanziView.surfaceCreated)SurfaceHolder.Callback.surfaceDestroyed(KanziView.surfaceDestroyed)
请参阅 https://developer.android.com/reference/androidx/lifecycle/Lifecycle.Event.html 和 https://developer.android.com/reference/android/view/SurfaceHolder.Callback。
此图表展示了 Kanzi 应用程序在 Android 平台上的初始化序列。
将 Kanzi application framework (appfw) 添加到您的 Android 应用程序¶
要在现有的 Android Studio 应用程序工程中使用 Kanzi application framework (appfw):
集成 Kanzi 库
将
KanziView添加到您的 Android 活动导入 Kanzi Studio 工程资产
将 Kanzi 库集成到 Android Studio 工程中¶
您可以将 Android Studio 工程设置为依赖预构建的 Kanzi Android 库,并将原生 Kanzi 库作为 Android 库子工程,从而将 Kanzi 添加到您的 Android 应用程序中。
要将 Kanzi 库集成到现有 Android Studio 工程中:
从
<KanziWorkspace>/Templates/Android_library目录将以下内容复制到您的 Android 工程的根目录:getkanzi.gradle文件kanzinative目录
移除
<AndroidProject>/kanzinative/src/main/cpp目录中的内容。从您的 Kanzi 工程的
<ProjectName>/Application目录将以下内容复制到<AndroidProject>/kanzinative/src/main/cpp目录:CMakeLists.txt文件cmake和src目录
在您的工程的
settings.gradle或settings.gradle.kts文件中添加:dependencyResolutionManagement { repositories { flatDir { apply from: 'getkanzi.gradle' dirs getKanziAndroidLibrariesPath() } } }
dependencyResolutionManagement { repositories { flatDir { apply(from ="getkanzi.gradle") dirs(extra.get("getKanziAndroidLibrariesPath")) } } }
此实用工具可帮助您的工程从本地 Kanzi 安装或平台包中查找 Kanzi 库。
您可以选择:
将您的工程保存在 Kanzi 工作区目录中
将
KANZI_HOME环境变量指向您的 Kanzi 工作区在您的工程的
local.properties中,将kanzi.home属性设置为您的 Kanzi 工作区或平台包从您自己的位置或存储库包含 Kanzi 库
要将
kanzinative作为子工程包含,请在您的工程的settings.gradle或settings.gradle.kts文件中添加:include ':kanzinative'
include(":kanzinative")
要使您的应用程序依赖预构建的 Kanzi Android 库和
kanzinative子工程,请在您的工程的app/build.gradle或app/build.gradle.kts文件中添加:dependencies { implementation 'com.rightware.kanzi:kanziruntime@aar' implementation project(':kanzinative') }
dependencies { implementation("com.rightware.kanzi:kanziruntime@aar") implementation(project(":kanzinative")) }
将 KanziView 添加到 Android 活动¶
要将 KanziView 添加到 Android 活动:
将
KanziView添加到您的 Android 应用程序内容中,并设置其布局。例如,在
app/src/main/res/layout/content_main.xml中,添加:<com.rightware.kanzi.KanziView android:id="@+id/kanzicontent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="24dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" />
将
Configuration和KanziView类导入到 Android 活动中。例如,在
app/src/main/java/com/rightware/<projectname>/MainActivity.java中添加:import android.content.res.Configuration; import com.rightware.kanzi.KanziView;
在
MainActivity.java文件中,将 Kanzi 视图添加到MainActivity类中:public class MainActivity extends AppCompatActivity { private KanziView mView = null; @Override protected void onCreate(Bundle savedInstanceState) { ... mView = findViewById(R.id.kanzicontent); mView.registerLifecycle(getLifecycle()); } ... @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mView.setOrientation(newConfig.orientation); } }
将 Kanzi Studio 工程资产添加到您的应用程序¶
要将 Kanzi Studio 资产添加到您的 Android 应用程序:
使用以下方式之一,将 Kanzi Studio 工程资产(例如 kzb 和 cfg 文件)导入到您的 Android Studio 工程中:
在您的 Android Studio 工程的
app/build.gradle或app/build.gradle.kts中,设置指向您的 Kanzi Studio 工程的<ProjectName>/Application/bin目录的路径:android { defaultConfig { sourceSets { main { assets.srcDirs = "<ProjectName>/Application/bin" } } } }
android { defaultConfig { sourceSets.named("main") { assets.srcDirs("<ProjectName>/Application/bin") } } }
将 Kanzi Studio 工程的
<ProjectName>/Application/bin目录中的内容复制到 Android Studio 工程的app/src/main/assets目录中。在 Kanzi Studio 中,在 Project > Properties 中将 Kanzi Studio 工程的 Binary Export Directory 属性设置为 Android Studio 工程的
app/src/main/assets目录。这样即可告知 Kanzi Studio 将工程的 kzb 文件导出到何处。
备注
Kanzi Studio 不会导出
application.cfg文件。请手动将该文件复制到 Android Studio 工程的app/src/main/assets目录中。
禁用对所导入资产文件的压缩,以便 Kanzi Engine 能够加载这些文件。在工程的
app/build.gradle或app/build.gradle.kts文件中添加:android { aaptOptions { noCompress "kzb", "cfg", "json" } }
android { androidResources { noCompress += listOf("kzb", "cfg", "json") } }