如何在jni中为android设置预建库?

如何在jni中为android设置预建库?,android,makefile,android-ndk,java-native-interface,Android,Makefile,Android Ndk,Java Native Interface,您好,我需要在本机代码中使用一个预构建的库,因此我将按照ndk/samples/native活动中的示例放置该库。结构如下。请有人帮我解决这个错误,dsplink.h找不到。提前感谢:) 在jnihello项目之前,您应该在Android.mk中定义预构建库dsplink: # # DSPLINK # include $(CLEAR_VARS) LOCAL_MODULE := dsplink LOCAL_SRC_FILES := [path]/libs/armeabi/libdsp

您好,我需要在本机代码中使用一个预构建的库,因此我将按照ndk/samples/native活动中的示例放置该库。结构如下。请有人帮我解决这个错误,dsplink.h找不到。提前感谢:)


jnihello
项目之前,您应该在Android.mk中定义预构建库
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

您的C文件包括dsplink.h文件。如果有,您应该在
LOCAL\u C\u INCLUDES
中添加此文件的完整路径,例如

LOCAL_MODULE     := jnihello
LOCAL_C_INCLUDES := $(LOCAL_PATH)/inlcudes
顺便说一句,如果预先构建了dsplink.a文件,您可以安全地将其保存在libs/文件夹之外,以便
清除
不会删除它。你可以用像

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

帮助链接器查找文件。

我发现弗拉基米尔的做法是正确的。 但是不要将静态库保存在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

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

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)
您可以在下图中看到项目目录结构。

如果您试图构建一个单独的lib.so文件,并在主lib.so中使用它,那么这个答案可能有助于您完成后续步骤。当dsplink.h文件依赖于许多其他头文件时会发生什么情况???我必须添加它们好吗??我不想像这样添加所有的头文件,它看起来很混乱……C语言的本质是所有包含文件都必须对编译器可用。但并不要求将所有与dsplink相关的文件都放在项目根目录下。无论它们位于何处,
LOCAL\u C\u包括
LOCAL\u LDLIBS
都应该让编译器找到它们。这是所有头文件所在的路径。但是我仍然没有得到dsplink.h错误…..您应该为
LOCAL\u C\u INCLUDES
使用不带空格的路径,如
C:/Docume~1/xavier~1/…