2011-09-09 46 views
5

Tôi đang làm việc với Android NDK r6b dưới cygwin (hệ thống được cập nhật chính xác). Tôi đang sửa đổi mẫu hello-jni để học cách làm việc với NDK. Vì tôi có một thư viện được viết bằng C++ mà tôi muốn sử dụng trong hello-jni (thực ra, tôi đã tạo một prj tên là helloworld với một tệp .cpp đơn gọi là ndkfoo.cpp), tôi đã tạo một dự án Android mới trong Eclipse (được cập nhật cho Android), đã thêm thư mục jni, đã thêm tệp Android.mk và Application.mk, đã chỉnh sửa chúng để biên dịch tệp .cpp. Khi kết thúc quá trình biên dịch, tôi có được một tệp .so.Android NDK - sự cố khi liên kết thư viện bên ngoài (không thể tìm thấy nó)

Bây giờ, trong helloworld Android.mk, tôi cần thực hiện một số chỉnh sửa để yêu cầu trình liên kết đưa vào thư viện đó. Giả sử các tập tin thư viện là libmylib.so, tôi đã kịch bản android.mk sau:

LOCAL_PATH: = $ (gọi my-dir)

bao gồm $ (CLEAR_VARS)

LOCAL_MODULE: = ndkfoo

LOCAL_SRC_FILES: = ndkfoo.cpp

LOCAL_C_INCLUDES + = $ (LOCAL_PATH)/mylib

LOCAL_LDLIBS + = -L $ (LOCAL_PATH) /../../ mylib/libs/armeabi/-lmylib

bao gồm $ (BUILD_SHARED_LIBRARY)

thư mục My được tổ chức theo cách sau:

d:/android/android-ndk-r6b => android ndk root 
d:/android/workspace/helloworld => helloworld project 
d:/android/workspace/mylib => mylib project library 

(do đó, đường dẫn đến libmylib.so là: d:/android/workspace/mylib/libs/armeabi).

Thật không may, điều này dường như không hoạt động. Nếu tôi xóa mọi tham chiếu đến mylib từ ndkfoo.cpp, nó sẽ biên dịch và chạy ngay cả trên điện thoại của tôi. Nếu tôi không loại bỏ các tham chiếu tới mylib, nó biên dịch nhưng doens't liên kết: tôi có được kết quả sau:

D: /android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4. 3/prebuilt/windo ws/bin /../ lib/gcc/arm-linux-androideabi/4.4.3 /../../../../ arm-linux-androideabi/ bin/ld. exe: không thể tìm thấy -lmylib

Ps. Tôi quên đề cập đến rằng tôi chạy ndk-buld trong thư mục jni của dự án helloworld. Pss. Tôi đã tìm thấy rất nhiều câu hỏi tương tự trên internet. Tôi đã luôn luôn làm việc với Visual C/C++ IDE, vì vậy tôi thực sự mới để GCC, makefiles và vân vân ...

+1

Ok, tìm cách giải quyết vấn đề này. Đối với một số lý do lạ mà tôi không hiểu, đường dẫn được chỉ định là -L/cygdrive/d/android/không gian làm việc/mylib/libs/armeabi không hoạt động (và đây là lý do tại sao việc sử dụng kết quả LOCAL_PATH bị lỗi). Thay vào đó, sử dụng -Ld:/android/workspace/mylib/libs/armeabi hoặc -L ../../ mylib/libs/armeabi không hoạt động. Tôi cho rằng cygwin là vấn đề ở đây ... – Luke

+0

đăng bình luận của bạn như là câu trả lời nếu nó giải quyết vấn đề của bạn –

Trả lời

1

Thông điệp

D:/android/android-ndk-r6b/toolchains /arm-linux-androideabi-4.4.3/prebuilt/windo ws/bin /../ lib/gcc/arm-linux-androideabi/4.4.3 /../../../../ arm-linux -androideabi/bin/ld.exe: không thể tìm thấy -lmylib

cho bạn biết rằng trình liên kết không tìm thấy thư viện của bạn, điều này sẽ đến từ một vấn đề trong đường dẫn LD_LIBS '.

Tôi nghĩ rằng macro của tôi-dir không bao gồm số nhận dạng đơn vị của thiết bị như vậy, biến LOCAL_PATH của bạn nên bỏ qua D: và, tôi nghĩ, sẽ không hoạt động với Cygwin. Tôi là một người sử dụng Linux và tôi không chắc chắn 100% nhưng, nếu bạn thay thế

LOCAL_PATH := $(call my-dir) 

bởi

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

cần làm việc. Mặt khác, bạn luôn có thể đặt đường dẫn tương đối bằng cách đặt:

LOCAL_LDLIBS += -L$../../mylib/libs/armeabi/ -lmylib 
Các vấn đề liên quan