2014-12-30 22 views
8

Tôi có một ứng dụng Android được biên dịch với AOSP (Kitkat) làm ứng dụng hệ thống android và hoạt động tốt. Ứng dụng của tôi phụ thuộc vào mã gốc được biên dịch bằng Android-NDK làm thư viện 32 bit. Tôi đang sao chép các thư viện gốc trong các ứng dụng Android của mình libs/armeabi thư mục rồi xây dựng ứng dụng Android của tôi trong AOSP (Tôi cũng đã sửa đổi device.mk để sao chép libs của mình trong thư mục /system/lib). Mọi thứ đang hoạt động tốt trên Android Kitkat.cách sử dụng các thư viện gốc 32 bit trên nền tảng Android 64-bit

Khi tôi chuyển ứng dụng của tôi trên Android-L (nền tảng 64bit) sau đó tôi không thể tải thư viện mẹ đẻ của tôi từ một ứng dụng Android và lỗi là như thế nào -

java.lang.UnsatisfiedLinkError: dlopen failed: "libfoobar.so" is 32-bit instead of 64-bit

Tôi đang sử dụng mã java sau để tải library- mẹ đẻ

 if (ENABLE_ANDROID_INTEGRATION) 
     { 
      System.load("/system/lib/libfoobar.so"); 
     } 
     else 
     { 
      System.loadLibrary("foobar"); 
     } 

Khi tôi đang xây dựng mã của tôi với AOSP sau đó ENABLE_ANDROID_INTEGRATIONđúng

More thú vị khi tôi tắt ENABLE_ANDROID_INTEGRATION và xây dựng ứng dụng của tôi trong Eclipse, ngoài AOSP như một ứng dụng "tải" bình thường sau đó ứng dụng của tôi đang chạy tốt trên 64bit nền tảng Android.

Điều tôi muốn biết - làm cách nào tôi có thể xây dựng ứng dụng của mình dưới dạng ứng dụng hệ thống Android gốc với thư viện 32 bit (có nghĩa là xây dựng AOSP) cho nền tảng Android 64 bit?

Những gì tôi đã thử - Tôi đã sử dụng LOCAL_32_BIT_ONLY = true gắn cờ trong tệp Android.mk của ứng dụng Android của tôi nhưng nó không có ích. Có thể tôi không hoàn toàn nhận thức được việc sử dụng cờ này.

Vì tôi sắp hết thời gian nên tôi thích đăng câu hỏi này ở đây thay vì RnD. Nếu có ai phải đối mặt với vấn đề này thì vui lòng hướng dẫn.

Kính trọng, Meraj

Trả lời

8

Lý do tại sao nó hoạt động khi được cài đặt như một ứng dụng của bên thứ ba, đó là vào cài đặt, quản lý gói quét APK và kiểm tra nếu nó sử dụng thư viện bản xứ, và nếu như vậy được tìm thấy, nó lưu trữ ABI mà họ đã sử dụng (vì nó chỉ cài đặt các thư viện cho một ABI duy nhất, vì vậy thông tin về lựa chọn nào đã được thực hiện cần được lưu trữ ở đâu đó).

Đối với ứng dụng được cài đặt hệ thống rộng với thư viện trong/system/lib, không rõ ứng dụng cụ thể này phụ thuộc vào một số ứng dụng libs cụ thể trong/system/lib (không có sẵn trong phiên bản 64 bit) trong/system/lib64), do đó, trình quản lý gói/ứng dụng không thể biết rằng ứng dụng cụ thể này yêu cầu một ABI cụ thể và do đó chạy nó trong chế độ 64 bit.

Cài đặt LOCAL_32_BIT_ONLY có thể chỉ ảnh hưởng đến việc liệu nó có nên được biên dịch ở chế độ 32 bit không, theo cách nào nó sẽ được chạy.

Một báo cáo cũ (và có lẽ đã lỗi thời) tại http://www.slideshare.net/hidenorly/investigation-result-on-64-bit-support-in-aosp dường như gợi ý rằng các thư viện nguồn gốc cho các ứng dụng nên đi vào/system/lib/apkname, nhưng điều này dường như không đến mức khó tin trên một hệ điều hành Android 5.0 thực tế .Thay vào đó, libs dường như nằm trong/system/app/tên ứng dụng/lib/abiname. Một số ứng dụng dường như có libs gốc cho nhiều kiến ​​trúc (ví dụ: "arm" và "arm64" là abiname), trong khi những ứng dụng khác chỉ có một kiến ​​trúc đơn (bắt buộc quá trình này bắt đầu ở chế độ ABI đó). Vì vậy, tôi nghĩ rằng bạn cần phải thay đổi cơ chế cho cách bạn cài đặt thư viện gốc của mình (bạn đã nói bạn đã sửa đổi thiết bị.mk) - Tôi không quen với cách tạo ứng dụng riêng như một phần của bản dựng AOSP, nhưng tôi muốn khuyên bạn nên cố gắng nhìn vào các ứng dụng hiện có kèm như thế nào họ làm điều đó, điều này cam kết có thể liên quan: https://android.googlesource.com/platform/packages/apps/Terminal/+/1a161f75%5E%21/

+1

Cảm ơn thông tin này. Nó đã giúp tôi rất nhiều để di chuyển đúng hướng. –

+1

Xin chào @MerajAhmad, tôi đang đối mặt với vấn đề tương tự, bạn có thể mô tả cách bạn đã làm không? Cảm ơn bạn – jDourlens

4

tôi có cùng một vấn đề và tìm thấy câu trả lời herehere Xóa tất cả các thư viện 64-bit và trái chỉ libs 32-bit: Trong Android.mk:

APP_API := armeabi armeabi-v7a x86 mips 

Trong build.gradle (Học phần: ứng dụng):

ndk { 
    moduleName "<module_name>" 
    abiFilters "armeabi", "armeabi-v7a", "x86", "mips" 
} 
+0

trên thực tế chỉ abiFilters "armeabi", "armeabi-v7a", "x86", "mips" một phần, cùng với android.useDeprecatedNdk = true trong gradle.properties dường như là đủ. –

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