【问题标题】:Calling .SO functions from a java Class using JNI使用 JNI 从 java 类调用 .SO 函数
【发布时间】:2019-03-20 14:37:40
【问题描述】:

我知道这可能看起来很奇怪,但是,现在我有一个 .SO(C 中的共享对象)并且必须在我的 Android 项目中使用。

现在我的要求是直接在 Java 中调用 .SO 中的函数,为 .SO 中的标头创建 JNI 包装器。

我的问题是我假设流程是什么,

1.创建 JNI 本地方法 -> 然后创建头文件,然后 -> 从头文件创建这些方法的实现,将 .SO 中的 .h 文件包含在本地实现中并调用 .SO 中存在的方法

  1. 直接为 .SO 中的头文件创建一个 JNI 本机方法,它将直接调用 C 方法。

  1. 我们还有其他方法吗?

如果我遗漏了什么,请纠正我。

我已经参考了一些在线内容,我可以说以下所有这些示例都与我需要的完全不同。

https://www.codepool.biz/package-jni-shared-library-jar-file.html

https://www.codepool.biz/build-so-aar-android-studio.html

https://dzone.com/articles/generating-executable-jar-file

https://www.ibm.com/developerworks/java/tutorials/j-jni/j-jni.html

How to use c lib(.so) from android?

【问题讨论】:

标签: java android java-native-interface .so


【解决方案1】:

通常,您有:

  • lib.so - 黑匣子
  • lib.h - 库头文件暴露了一些 lib.so 方法。这些是您可以使用的方法。
  • jni.cppjni.h 文件 - 此代码是 java 和 lib 端之间的桥梁。在这里,您导入 lib.h 头文件。这样,你会收到来自 java 端的调用,与 lib.so 方法通信并将结果发送回 java 端。

最后,你必须有一个 JNI 代码,它负责与 java 和 lib 端进行通信。该实现可以是非常基本的,例如调用 lib 方法并返回结果,也可以更复杂,例如启动线程,等待结果,然后在完成后报告更复杂的类等。

在任何情况下,您的 JNI 代码(可以是单个方法或更复杂的类)都必须包含 lib.h 头文件才能调用 lib.so 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多