为 Android (JNI) 编译 Ada 库

问题描述 投票:0回答:2

我用 Ada 编写了一个应用程序,我想在 Android(ARM 设备)上运行它。我在 Raspberry Pi 上为 ARM (arm64-v8a) 编译了一个本地独立库,其中包含适当的 JNI。但是,当我在 Android 中启动应用程序时,它在加载库时失败(就在 System.loadLibrary 调用上)。 以这种方式进行在理论上是否存在错误,或者它应该有效吗?

在android上做这个实验之前,我使用x64 PC在Java上成功加载了一个Ada测试库,所以我认为问题不在接口本身。 我本来希望库可以毫无问题地加载。

android raspberry-pi arm java-native-interface ada
2个回答
2
投票

大约十年前,comp.lang.ada 上有一些关于此的主题。根据记忆,最好的进展是使用启用了 gnat 的 gcc 的 Dragonfly BSD Unix 构建。我可以用这种方式构建独立的 Ada 控制台应用程序并在平板电脑上运行它们。

Dragonlace 编译器项目在这里

与 Java/GUI 等接口需要 NDK,遵循使用 C++ 代码或库的 NDK 演示。然而,我既没有设法让 NDK 识别 Dragonfly BSD gnat 编译器,也没有用 --enable-languages=c,c++,ada 重建 NDK gcc:任一路径都会导致一串我无法解决的错误。

我上次看是在几年前,NDK 正在弃用 gcc,转而支持 LLVM,而当时,LLVM 编译器没有 Ada 前端(尽管很有趣,LLVM 有一个 VHDL 前端, 用 Ada 写的!)

另外,我相信 Adacore 现在有一个带有 LLVM 后端的 Gnat 版本,至少作为一个内部产品,我想我不知道它是否已经发布到 FSF Gnat 树。

Github 上的 Gnat/LLVM 在这里。

这里有来自 Adacore 的更多信息。

这里是 Gnat/LLVM 上的旧 comp.lang.ada 线程。

但我认为您正在考虑要么说服最近的 NDK 仍然承认 GCC,要么:

  • 使用 Gnat 启用 GCC
  • 说服 NDK 与启用了 gcc 的外部 Gnat 一起工作

或者将 NDK 的 LLVM 编译器与 Adacore 的 Gnat/LLVM 前端相结合。

这些方法都不是微不足道的。


0
投票

当我在 Android 中启动应用程序时,加载失败 库(就在 System.loadLibrary 调用上)。有什么东西吗 以这种方式进行在理论上是错误的,或者它应该有效吗?

我不确定如果加载库调用(a)以正确的格式存储,并且(b)使用正确的机器代码,为什么它会失败。但是,加载时,您可能必须手动调用初始化函数(IIRC

adainit
)。

几年前,有人在库中遇到 Ada 问题,归结为加载后立即进行初始化,以及完成时调用终结(

adafinal
?),IIRC 释放内存/图书馆已经开始的任务。

© www.soinside.com 2019 - 2024. All rights reserved.