2013-02-20 50 views
0

我试图建立一个库,我的NativeActivity的应用,并使用它,但它给我一个错误:建立和Android的NDK使用静态库

拥有这些文件:

-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的。尽管如此,它编译,所以这不是问题......

我应该修改,所以我可以利用它?

回答

1

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

您应该重命名lodepng.clodepng.cpp

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

+0

确实如此!我很惊讶一个简单的扩展名可以在Android代码中造成这样的问题。非常感谢!从现在开始我会更加小心! :) – 2013-02-21 18:17:35

+0

@MārtiņšMožeiko你能帮我在这里http://stackoverflow.com/questions/25618201/how-to-enable-auto-complete-intellisense-for-ndk-in-eclipse – 2014-09-04 08:43:30

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) 

该模块应该用作预建静态库。

+0

'$包括(PREBUILD_STATIC_LIBRARY)'什么也没做,它甚至没有编译'liblodepng.a'这个时候,我找不到它在网络上的任何信息。 您是否意思是'include $(PREBUILT_STATIC_LIBRARY)'而不是?在第二种情况下,它告诉我该文件应该指向一个'.a'文件... – 2013-02-21 01:54:34

相关问题