2013-02-20 53 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