【问题标题】:Native method not found while using .so File in libs Android在 libs Android 中使用 .so 文件时找不到本机方法
【发布时间】:2014-01-15 08:08:28
【问题描述】:

我有使用 c 库创建的 .so 文件。现在我想在另一个项目中使用 .so 文件来调用这些函数。我不知道如何使用该库。如何调用该库中的任何函数?我试过但发现错误,因为找不到本地方法。我是 android 中 Ndk 的初学者。对此有任何帮助..??

我提到了许多链接,这些链接没有解决我的问题 Native method not found,

java.lang.UnsatisfiedLinkError: Native method not found,

我面临与此链接相同的问题,但没有得到答复。链接是 Need NDK Help: How to call a C++ function for shared library from another project that uses C++

我的 Android.mk 文件如下,我从中创建了 .so 文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := ShairportSample
LOCAL_SRC_FILES := ShairportSample.cpp
APP_PLATFORM := android-19
include $(BUILD_SHARED_LIBRARY)

【问题讨论】:

  • 您是否将该库作为 LOCAL_SHARED_LIBRARIES 添加到您的 Android.mk 中的主模块中?在这里发布你的 Android.mk 真的很有帮助,因为没有关于你如何处理事情的信息。
  • @user2359247 项目的 mk 文件,我从中创建了 .so 文件 ??..因为在另一个我没有那个文件之前。
  • 正如我猜想的那样,您不会将该共享库添加到您的模块中。答案应该可以解决您的问题。
  • @user2359247 我是否还需要 Android Project 中的 .mk 文件。就我而言,调用项目不是任何 Ndk 项目。他们是否也需要将其设为 Native 项目。?
  • @Manmohan,我猜你有项目 A(JNI 项目)和你通过构建 A 生成的 A.SO。而且,上面的 .mk 文件属于 A 项目。现在,您想要项目 B,并且您想在项目 B 中使用 A.SO。这是场景吗? B项目的本质是什么?

标签: android android-ndk


【解决方案1】:

您可以调用在 .so 中实现的函数,以便从另一个 NDK 库中重用,方法是将其设置为您在 Android.mk 文件中依赖的预构建共享库:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ShairportSample
LOCAL_SRC_FILES := libs/$(TARGET_CPU_ABI)/libShairportSample.so
LOCAL_EXPORT_C_INCLUDES := PATH_TO_ShairportSample.h
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := yournewlib
LOCAL_SRC_FILES := yournewlib.cpp
LOCAL_SHARED_LIBRARIES += ShairportSample
include $(BUILD_SHARED_LIBRARY)

从您的 Java 代码中,您必须先从您的 Java 中加载 ShairportSample lib,然后再加载 yournewlib。

否则,如果您想直接从 Java 重用 .so,则应导出使用它的 Java 库 (.jar)。然后,您可以从其他项目中重用这个 Java 库。

【讨论】:

  • 我有项目 A(JNI 项目)和我通过构建 A 生成的 A.SO。而且,上面的 .mk 文件属于 A 项目。现在,我有项目 B 并想在项目 B 中使用 A.SO。我应该在我的项目中添加你的 .mk 文件代码。
  • 请告诉我之前的评论,因为我是 Native Developments 的新手。
  • 你应该把这段代码放到你的项目B的Android.mk文件中。
  • 为此我还需要为B项目提供原生支持。?现在还需要 Application.mk 吗? PATH_TO_ShairportSample.h 等值的格式是什么
  • 是的,但是如果您想从 Java 中使用它,它也是可能的。在这种情况下,您应该从您的项目 A 中创建一个 Java 库,正如我在回答末尾所说的那样。 PATH_TO_ShairportSample 可以是例如 projectA/jni/include
【解决方案2】:
  1. 首先,你应该确保.so文件被正确编译,命名为libYourLibName.so,放入libs/armeabi文件夹。

  2. 其次,确保您已从静态块加载 .so 文件

静态{ System.loadLibrary("YourLibName"); }

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多