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

时间:2012-06-15 06:28:28

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

  

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

directory structure

Android.mk

the error

hello-jni.c

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的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

帮助链接器找到文件。

答案 2 :(得分:0)

libmath-prebuilt.so是一个预建的库,它有一些由buyya_read.c使用的函数。首先使用ndk-build生成libmath-prebuilt.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)

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

答案 3 :(得分:-1)

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

#
# 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