java - Android 如何处理多个实例数据/身份和 JNI

标签 java android java-native-interface

这是一个良好实践和智能解决方案的问题,我需要一个建议。

我有一个应用程序(据我在 Stackoverflow 和 Google 搜索中所见):

  • 该应用程序处理各种文档,我喜欢它可以 同时处理多个文档。 (我习惯了 Win32,其中每个实例有一个程序段和一个数据段,但在 Android/Java 中显然不是这种情况。)
  • 我看到一个实例从应用存储(平板电脑)启动应用,另一个打开 Gmail 或带有附加文档文件的电子邮件,第三个实例从 ES 文件浏览器等文件处理应用打开文件。我喜欢它们都可以在两者之间翻转。用户可能希望一次阅读多个文档。 (如果我在 Android/Java 环境中使用了单词实例错误,请纠正我)
  • 该应用程序构建在包含所有数据和逻辑以及 Java Android 用户界面的 JNI 部分中。(JNI 部分设计为独立于操作系统以在不同操作系统中实现,具有粘贴 c 文件。)
  • Android 部分会在每次屏幕翻转或实例翻转时重新创建
  • 只有一个 JNI 实例,即使在重新创建 Android Java 部分并且清除所有 Java 数据时,它仍会保留,现在它在所有情况下显示最后读取的文件,在按下正在运行的应用程序按钮之间翻转
  • 在 JNI 部分中创建不同的实例没有问题,只要可以将它们绑定(bind)到每个 Java 实例,具有身份或我可以在交换中用作参数的东西与 JNI 部分,但是如何
  • 我无法在每个实例中保存例如 FilePathName 来标识 Java 部分中的实例,因为它会在重新创建 Java 部分时被删除。

第一个问题是,我阅读 Stackoverflow 和 Google 文章的观察结果是否正确?

第二个问题,在解决问题上有什么好的建议吗?我需要一个建议

  • 是否有可能在所有情况下识别个体,只要它还活着?
  • 任何其他可能的路径,既可以解决为每个实例分离数据的一般问题,也可以为 JNI 识别实例以处理每个实例的数据?

最佳答案

一月

我们的应用程序中的 JNI 对象也有类似的问题。问题是 JNI 链接不能像普通的 Java 对象一样工作,必须显式释放。同时,我们有可以随时被 Android 销毁的 Activity。

我们当前的解决方案是在应用程序级别存储 JNI 对象,以便在引用为零时管理引用和删除对象。如果要永远销毁 Activity ,还会销毁 JNI 引用。所以这与您在上一篇文章中所做的类似。

但是,如果您希望您的应用程序在一段时间后具有可扩展性,您可能会明白此解决方案并不理想。

Android 系统有时会临时销毁 Activity 以节省内存。在您的情况下,所有带有文档的 JNI 对象仍会消耗内存。所以这里最好的解决方案是能够将 JNI 级别的文档保存其状态以进行 bundle 。如果您的文档可以被用户更改,这一点尤其重要。在这种情况下,通过在 onSaveInstanceState 中保存 JNI 对象的状态,您可以销毁 JNI 对象并在 onCreate 中重新创建。然而,这里重要的是分析销毁/创建保存到 bundle 文档的 JNI 对象需要多少时间,因为我们必须在某些情况下(例如纵向/横向模式)使用一些有限的 bundle (不超过 1Mb)支持快速 Activity 重建).如果过程很长,这个解决方案可能不好。 同样,您希望完成一项任务 - 一个文档系统。当您在一项任务中有多个 Activity 时,您应该考虑这种情况。

Android 不总是调用 onDestroy() 的第二项。如果你在这里做一些保存操作,数据有时可能会丢失。

希望这些信息对您有所帮助。

关于java - Android 如何处理多个实例数据/身份和 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34304677/

相关文章:

java - 通过 Fragment 显示 Activity 时出错

java - 在 Java 中获取特定于语言环境的日期/时间格式

Java UDP 消息交换可以在本地主机上工作,但不能在 Internet 上工作?

java - Maven 3.6.0 中自动更新项目版本

java - Android 应用程序仅在我从 Android Studio 安装时有效但当我直接在其他手机上安装 APK 时无效

java - 如何通过 JNI 创建 HashMap<String, String> 然后解析为 java

android - 如何在 Android 上的 Java Canvas 对象上使用 SKIA C++ API 进行绘图?

android - 来自 XML 字符串的 HashMap - Android

java - OpenGL 未按预期渲染

android - NV21 ByteArray 到 array2d<rgb_pixel>