【问题标题】:how to setup a prebuilt library in jni for android?如何在 jni 中为 android 设置预建库?
【发布时间】:2012-06-15 06:28:28
【问题描述】:

嗨,我需要在我的本机代码中使用预构建的库,所以我将库放在 ndk/samples/native-activity 中的示例之后。下面是结构。请有人帮我解决这个错误,找不到 dsplink.h。在此先感谢:)

【问题讨论】:

标签: android makefile android-ndk java-native-interface


【解决方案1】:

我认为弗拉基米尔是在正确的轨道上。 但是不要将静态库保留在 obj 文件夹中,因为每次运行都会删除它,而是创建一个 jni/modules/precompiled 或其他东西并将这些东西放在那里...

您拥有的是一个预编译的静态库。这就是 .a 文件。 它旨在将其添加到编译过程中,以便它将在最终的二进制文件中。 所以你应该拥有的是:

#
# DSPLINK
#
include $(CLEAR_VARS)
LOCAL_MODULE    := dsplink
LOCAL_SRC_FILES  := [path-to-prebuilt-lib]/libdsplink.a
LOCAL_EXPORT_C_INCLUDES := [path-to-dsplink-headers-folder]
include $(PREBUILT_STATIC_LIBRARY)

并且不要忘记将它包含在项目中的链接器中。所以在主共享库的这一部分下面添加这一行:

LOCAL_STATIC_LIBRARIES := dsplink

【讨论】:

    【解决方案2】:

    您的 C 文件包含 dsplink.h 文件。如果你有,你应该在LOCAL_C_INCLUDES中添加这个文件的完整路径,例如

    LOCAL_MODULE     := jnihello
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/inlcudes
    

    顺便说一句,如果 dsplink.a 文件是预先构建的,您可以将其保存在 libs/ 文件夹之外,这样 >make clean 不会删除它。您可以使用类似

    LOCAL_LDFLAGS += $(LOCAL_PATH)/prebuilt/dsplink.a
    

    帮助链接器找到文件。

    【讨论】:

    • 当 dsplink.h 文件依赖于许多其他头文件时会发生什么?我必须添加它们好吗?我不想像这样添加所有的头文件,看起来很乱......
    • C 语言的本质是所有包含文件都必须对编译器可用。但是不需要将所有dsplink相关的文件都放在项目根目录下。无论它们位于何处,LOCAL_C_INCLUDESLOCAL_LDLIBS 都应该让编译器找到它们。
    • 这是所有头文件所在的路径。但我仍然没有 dsplink.h 错误.....
    • LOCAL_C_INCLUDES 应该使用不带空格的路径,例如 C:/Docume~1/xavier~1/...
    【解决方案3】:

    libmath-prebuilt.so 是一个预建库,它有一些供 buyya_read.c 使用的函数。首先使用 ndk-build 生成 libmath-prebuilt.so 并保存在 jni 文件夹中,其中 buyya_read.c 保存在您的项目中的 elcipse 中。

    Android.mk
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := math-prebuilt
    LOCAL_SRC_FILES = libmath-prebuilt.so
    include $(PREBUILT_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE    := buyya_read
    LOCAL_SRC_FILES := buyya_read.c
    LOCAL_LDLIBS    := -llog
    LOCAL_SHARED_LIBRARIES := math-prebuilt
    include $(BUILD_SHARED_LIBRARY)
    

    您可以在下图中看到项目目录结构。

    【讨论】:

      【解决方案4】:

      您应该在您的 Android.mk 中 jnihello 项目之前定义预构建库 dsplink

      #
      # DSPLINK
      #
      include $(CLEAR_VARS)
      LOCAL_MODULE    := dsplink
      LOCAL_SRC_FILES  := [path]/libs/armeabi/libdsplink.so
      LOCAL_EXPORT_C_INCLUDES := [directory-with-dsplink.h-file]
      include $(PREBUILT_STATIC_LIBRARY)
      ...
      # jnihello
      

      【讨论】:

        猜你喜欢
        • 2015-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 2020-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多