【问题标题】:Build and use static library in Android NDK在 Android NDK 中构建和使用静态库
【发布时间】:2013-02-06 02:41:07
【问题描述】:

我正在尝试为我的 NativeActivity 应用程序构建一个库并使用它,但它给了我一个错误:

拥有这些文件:

-jni/
--android.mk
--application.mk
--main.cpp
--png/
---android.mk
---lodepng.c
---lodepng.h

jni/png/ 中的 android.mk 是这样的:

LOCAL_PATH  := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := lodepng
LOCAL_SRC_FILES := lodepng.c
# LOCAL_C_INCLUDES  := $(LOCAL_PATH)
LOCAL_CFLAGS    := -DLODEPNG_NO_COMPILE_ENCODER -DLODEPNG_NO_COMPILE_DISK -DLODEPNG_NO_COMPILE_ANCILLARY_CHUNKS -DLODEPNG_NO_COMPILE_CPP

include $(BUILD_STATIC_LIBRARY)

jni/ 中的 android.mk 是这样的:

LOCAL_PATH  := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := myapp
LOCAL_SRC_FILES := main.cpp
# LOCAL_C_INCLUDES  := $(LOCAL_PATH)/png
LOCAL_CFLAGS    := -DANDROID
LOCAL_LDLIBS    := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES  := lodepng android_native_app_glue

include $(BUILD_SHARED_LIBRARY)

include $(LOCAL_PATH)/png/android.mk

$(call import-module,android/native_app_glue)

(我已经评论了 C_INCLUDES,因为我不确定我是否需要它们。使用与否在结果上没有区别)。

我在编译时遇到的错误是这个:

C:\workspace\myapp> C:\cygwin\bin\bash --login -c "ndk-build -C ."
Compile++ thumb  : myapp <= main.cpp
Compile thumb  : lodepng <= lodepng.c
StaticLibrary  : liblodepng.a
SharedLibrary  : libmyapp.so
C:/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/..
/lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:
 ./obj/local/armeabi/objs/myapp/main.o: in function init():jni/main.cpp:194:
 error: undefined reference to 'lodepng_decode32(unsigned char**, unsigned int*,
 unsigned int*, unsigned char const*, unsigned int)'
C:/android-ndk-r8d/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/..
/lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe:
 ./obj/local/armeabi/objs/myapp/main.o: in function init():jni/main.cpp:196:
 error: undefined reference to 'lodepng_error_text(unsigned int)'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libmyapp.so] Error 1

在简历中,就像代码找不到此库的标头一样。尽管如此,它确实可以编译,所以这不是问题......

我应该编辑什么才能使用它?

【问题讨论】:

    标签: android-ndk native-activity


    【解决方案1】:

    您可以在 jni/png 中更改 Android.mk。

    LOCAL_PATH  := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := lodepng
    LOCAL_SRC_FILES := lodepng.c
    # LOCAL_C_INCLUDES  := $(LOCAL_PATH)
    LOCAL_CFLAGS    := -DLODEPNG_NO_COMPILE_ENCODER -DLODEPNG_NO_COMPILE_DISK - DLODEPNG_NO_COMPILE_ANCILLARY_CHUNKS -DLODEPNG_NO_COMPILE_CPP
    #include $(BUILD_STATIC_LIBRARY)
    include $(PREBUILD_STATIC_LIBRARY)
    

    此模块应用作预构建静态库。

    【讨论】:

    • include $(PREBUILD_STATIC_LIBRARY) 什么都没做,这次连liblodepng.a 都没有编译,我在网上也找不到它的任何信息。你的意思是include $(PREBUILT_STATIC_LIBRARY) 吗?在第二种情况下,它告诉我该文件应该指向一个.a 文件...
    【解决方案2】:

    我猜 C++ 名称修改是这里的问题。您的 lodepng.c 文件提供了 _lodepng_decode32 符号(因为它被编译为 C 代码),但您的 main.cpp 文件需要类似 _lodepng_decode32$asdaASd 符号(因为它被编译为 C++ 代码)。

    您应该将lodepng.c 重命名为lodepng.cpp

    或者您需要将#include "lodepng.h" 放入main.cpp 文件中的extern "C" { ... } block

    【讨论】:

    • 确实是这样!我很震惊一个简单的扩展名如何在 Android 代码上造成这样的问题。非常感谢!从现在开始我会更加小心! :)
    • @Mārtiņš Možeiko 你能帮我吗stackoverflow.com/questions/25618201/…
    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多