2012-01-30 6 views
5

Tôi cần phải xây dựng OpenSSL mới nhất (1.0.0g) cho một ứng dụng Android. Tôi đang cố gắng làm theo các ví dụ được đưa ra bởi https://github.com/fries/android-external-openssl, nhưng tôi chỉ không thể làm cho nó được xây dựng.Không thể xây dựng thư viện OpenSSL bên ngoài cho Android NDK trên Windows/Cygwin

Tôi đang chạy Windows 7 Professional (64 bit) với Cygwin hoàn chỉnh và gần đây. Tôi đã cài đặt Android SDK và NDK và tôi có thể xây dựng thành công và chạy ứng dụng mẫu hello-jni của NDK.

Tôi đã tạo một ứng dụng mẫu NDK mới có tên là hello-openssl. Trong thư mục jni của tôi, tôi đã tạo một thư mục openssl. Ở đó, tôi giải nén https://github.com/fries/android-external-openssl/zipball/master, mà đã cho tôi cơ cấu này cây dưới c: \ android \ android-ndk \ samples \ hello-openssl:

jni 
+- openssl 
    +- apps 
    +- crypto 
    +- include 
     +- openssl 
    +- ssl 

sau đó tôi sửa đổi Android.mk tập tin trong JNI thư mục trong một nỗ lực để bao gồm các tập tin OpenSSL:

subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \ 
    openssl \ 
)) 

include $(subdirs) 

Bây giờ khi tôi thực hiện ndk-build, nó biên dịch nhiều file .c, nhưng sau đó nhanh chóng thất bại:

Compile thumb : crypto <= cryptlib.c 
In file included from jni/openssl/crypto/cryptlib.c:117: 
jni/openssl/crypto/cryptlib.h:65:18: error: e_os.h: No such file or directory 
jni/openssl/crypto/cryptlib.h:72:28: error: openssl/crypto.h: No such file or directory 

Tôi tìm thấy http://osdir.com/ml/android-ndk/2010-07/msg00424.html, cho tôi biết "thêm jni và jni/include vào LOCAL_C_INCLUDES" ở trên trong crypto/Android.mk, nhưng tôi không thể tìm ra cú pháp tôi nên sử dụng để đạt được điều này.

Tôi cũng không thể tìm ra được cấu trúc thư mục chính xác.

Tôi chân thành đánh giá cao bất kỳ trợ giúp nào có thể được cung cấp.

Cảm ơn!

Trả lời

12

Tôi đã giải quyết vấn đề này bằng cách bỏ qua https://github.com/fries/android-external-openssl và thay vào đó sử dụng https://github.com/guardianproject/openssl-android.

Nó dựa trên OpenSSL mới hơn (1.0.0a) và được xây dựng trong NDK mà không có bất kỳ sửa đổi nào.

Lưu ý rằng để sử dụng các thư viện này trong ứng dụng Android, bạn phải đổi tên chúng. Nếu bạn chỉ cần bao gồm libssl.so và libcrypto.so kết quả trong ứng dụng của bạn, sau đó gọi System.LoadLibrary ("crypto") và System.LoadLibrary ("ssl"), bạn sẽ nhận được các thư viện OpenSSL có trong hệ thống Android, chứ không phải thư viện tùy chỉnh của bạn.

Để thực hiện việc này, chỉ cần thực hiện tìm kiếm toàn văn và thay thế ("libssl" -> "libsslx" và "libcrypto" -> "libcryptox") trong mỗi Android.mk (ví dụ: trong/crypto,/ssl và/apps).

Sau đó, trong ứng dụng Android của bạn, hãy gọi SystemLoadLibrary ("cryptox") và System.loadLibrary ("sslx")

+0

Xin chào, tôi đang cố gắng để làm điều tương tự như bạn đã làm, tôi đã sử dụng openssl-android, Tôi đã viết các tệp .so bằng cách sử dụng các thư viện này, đặt nó vào thư mục jni của tôi và đã viết một tệp Android.mk cho biết rằng tôi cũng sử dụng 2 chia sẻ khác các thư viện, mọi thứ biên dịch tốt nhưng bị treo trên thời gian chạy với một UnsatisfiedLinkError, sẽ rất tuyệt nếu chúng ta có thể nói chuyện. – onizukaek