【问题标题】:Passing Data between Java and C++ [closed]在 Java 和 C++ 之间传递数据 [关闭]
【发布时间】:2020-11-29 14:48:49
【问题描述】:

我正在开发一个应用程序,其中我有一个 Java 应用程序层和一个服务,它只不过是 C++ 中的一个插件。我需要从应用层调用本机代码API,这些API将通过AOSP框架开发的JNI层调用。

现在的问题是,我需要将一大块数据从应用层传递到原生层,然后再通过 JNI 调用传递到原生层。

我不想直接传递数据,而是想使用 sharedMemory (或任何有效的方式)。谁能建议我如何将数据从应用程序层传递到本机代码?

是否有任何可用的方法可以让我在本机层分配内存并从应用程序层访问该内存位置以将数据存储到该内存位置?

我不能使用用户实现的 JNI 层。

【问题讨论】:

  • 使用FlatBuffers(或其他一些内存效率高、跨语言的数据序列化库)。

标签: java c++ shared-memory communication


【解决方案1】:

简短回答:否。

更长的答案: 您提到了 AOSP,所以我假设您使用的是 Android 操作系统。

AOSP 中的 JNI 实现非常特殊,只能通过函数参数和原始返回值与它进行通信。

可以使用 JNIEnv 方法在本机代码中创建 Java 对象的新实例,但强烈建议不要这样做。

一般来说,通过 JNI 在 Java 和本机之间移动大量数据的整个过程是有问题的。

阅读本文了解更多详情:https://developer.android.com/training/articles/perf-jni

【讨论】:

  • 感谢您的回复。但是不是通过 JNI 传递大量数据,而是可以为数据创建内存缓冲区,并且可以将该内存缓冲区的地址传递给本机层。 (或者)我可以在本机代码中创建一个缓冲区,我可以从 java 代码访问它以将数据块存储到该内存位置吗?
  • @Srinivas 不,你不能。 Java 和 Native 以非常不同的方式管理内存,Java 不能创建或处理本机指针。这正是您需要 JNI 函数来桥接 Java 数组/缓冲区和本机数组/缓冲区的原因。
猜你喜欢
  • 2015-06-26
  • 1970-01-01
  • 2011-05-03
  • 2017-03-28
  • 2017-11-22
  • 1970-01-01
  • 2014-06-29
  • 2018-02-07
  • 1970-01-01
相关资源
最近更新 更多