2012-12-06 30 views
5

Tôi đang cố gắng chuyển thư viện FFTW và một số tệp .cpp sang Android, sử dụng phiên bản 2.1.5 của FFTW. Tôi biên soạn nó bằng cách sử dụng các cấu hình & làm cho các lệnh và tôi cố gắng sử dụng nó như một thư viện được xây dựng sẵn. Trong dự án NDK tôi tất cả mọi thứ biên dịch không có lỗi, nhưng khi liên kết tôi nhận được lỗi sau:Android NDK: không có bảng biểu tượng lưu trữ

Compile++ thumb : water <= vertex.cpp 
Compile++ thumb : water <= face.cpp 
Compile++ thumb : water <= Solver.cpp 
Compile++ thumb : water <= Water.cpp 
SharedLibrary : libwater.so 
/Users/Xavi/Documents/android-ndk-r8c/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: /Users/Xavi/Documents/workspace/mmm/obj/local/armeabi/libfftw.a: no archive symbol table (run ranlib) 

My Android.mk code đang sau

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := fftw 
LOCAL_SRC_FILES := fftw/lib/libfftw.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := water 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/water/include 
LOCAL_SRC_FILES := \ 
water/src/vertex.cpp \ 
water/src/face.cpp \ 
water/src/Solver.cpp \ 
water/src/Water.cpp 
LOCAL_STATIC_LIBRARIES := fftw 
include $(BUILD_SHARED_LIBRARY) 

Tôi có làm điều gì sai, hoặc là nó tốt hơn để biên dịch thư viện FFTW theo cách khác?

+0

Hãy xem câu hỏi này: http://stackoverflow.com/questions/7234629/linking-fftw-into-an-android-ndk-application – Entreco

+0

Trình biên dịch nào bạn đã sử dụng để xây dựng FFTW? Bạn cần tạo ra một toolchain android độc lập, thích ứng FFTW với hệ thống xây dựng ndk (Android.mk etc), hoặc sử dụng một trong những hacking wrapper lỗi thời - bạn không thể đơn giản gọi các tệp nhị phân toolchain của android tạo phân phối ndk theo cách bạn sẽ là những người từ một số trình biên dịch thông thường. –

+0

Thư viện được xây dựng với trình biên dịch 'cc' của Apple, phiên bản 3.1. Tôi sẽ cố gắng biên dịch thư viện thông qua ndk, nhưng sau đó tôi nghĩ rằng tôi không hiểu cách sử dụng thư viện dựng sẵn – gibon

Trả lời

0

Tính năng này phù hợp với tôi.

LOCAL_PATH := $(call my-dir) 
ROOT_PATH := $(LOCAL_PATH) 

include $(call all-subdir-makefiles) 
include $(CLEAR_VARS) 

LOCAL_PATH = $(ROOT_PATH) 
LOCAL_CFLAGS := -Wall -Wextra 

LOCAL_MODULE := water 

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog 
LOCAL_STATIC_LIBRARIES := fftw3 
LOCAL_SRC_FILES := \ 
water/src/vertex.cpp \ 
water/src/face.cpp \ 
water/src/Solver.cpp \ 
water/src/Water.cpp 

include $(BUILD_SHARED_LIBRARY) 

Và tôi đã sử dụng chuỗi công cụ ndk android để xây dựng fftw đây là build.sh của tôi. Đặt điều này trong thư mục dự án Android của bạn và chạy nó và đặt fftw thư mục trong thư mục mẹ

#!/bin/sh 
# fftw3/build.sh 
# Compiles fftw3 for Android 
# Make sure you have NDK_ROOT defined in .bashrc or .bash_profile 

INSTALL_DIR="`pwd`/app/jni/fftw3" 
SRC_DIR="`pwd`/../fftw-3.3.4" 

cd $SRC_DIR 

export 
    PATH="<your path>/android-ndk-r11c/toolchains/arm-linux-androideabi- 4.9/prebuilt/darwin-x86_64/bin:$PATH" 
export SYS_ROOT="<your path>/android-ndk-r11c/platforms/android-17/arch-arm/" 
export CC="arm-linux-androideabi-gcc --sysroot=$SYS_ROOT" 
export LD="arm-linux-androideabi-ld" 
export AR="arm-linux-androideabi-ar" 
export RANLIB="arm-linux-androideabi-ranlib" 
export STRIP="arm-linux-androideabi-strip" 

mkdir -p $INSTALL_DIR 
./configure --host=arm-linux-androideabi --build=x86_64-apple-darwin -- 
prefix=$INSTALL_DIR LIBS="-lc -lgcc" 

make 
make install 

exit 0 

Và bạn sẽ tìm thấy fftw thư mục trong ứng dụng/JNI và nó sẽ bao gồm bin, bao gồm, lib, chia sẻ các thư mục và trong lib thư mục bạn sẽ tìm thấy libfftw3.a

Các vấn đề liên quan