我正在尝试为我的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
在简历中,就好像代码无法找到此lib的头部。然而,它确实编译,所以这不是问题......
我应该编辑什么才能使用它?
答案 0 :(得分:1)
我猜这里有C ++名称错误问题。您的lodepng.c文件提供了_lodepng_decode32
符号(因为它被编译为C代码),但是您的main.cpp文件需要_lodepng_decode32$asdaASd
符号(因为它被编译为C ++代码)。
您应该将lodepng.c
重命名为lodepng.cpp
。
或者您需要将#include "lodepng.h"
放在main.cpp
内的extern "C" { ... } block
文件中。
答案 1 :(得分:0)
您可以在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)
此模块应用作预构建静态库。