2012-08-29 28 views
6

Nâng cấp lên ndk 8b tôi nhận được một số báo cáo tai nạn (hầu hết trong số đó là Galaxy SII với Android 4,03)Android ndk 8b Không thể tải thư viện

java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: 1836 cannot locate '__gnu_thumb1_case_uqi'... 
at java.lang.Runtime.loadLibrary(Runtime.java:370) 
at java.lang.System.loadLibrary(System.java:535) 
at com.iuculano.fplayer.SDLActivity.void onCreate(android.os.Bundle)(SourceFile:324) 
at android.app.Activity.performCreate(Activity.java:4465) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 
at android.app.ActivityThread.access$600(ActivityThread.java:127) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4507) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
at dalvik.system.NativeStart.main(Native Method) 

Trường hợp ngoại lệ là do một đơn giản System.loadLibrary("main");

gì nghĩa là? cannot locate '__gnu_thumb1_case_uqi'

+0

hãy chạy ndk-build của bạn với V = 1 và đăng dòng lệnh cho bước liên kết –

+0

Bạn có gặp bất kỳ sự cố nào với các thiết bị có OS! = 4.0.3 không? – Supahfly

+0

Xin chào, tôi đang đối mặt với cùng một vấn đề, nơi tôi tải SQLiteDatabase.loadLibs (điều này) và nó ném cho tôi về ngoại lệ. Mà hoạt động tốt trong Android 4.2 và cao hơn, nhưng không làm việc trong HTC một thiết bị V có v4.0.3, xin vui lòng giúp đỡ !! – Zoombie

Trả lời

2

Bạn có biên soạn cho armv7 không? Nếu không, hãy thử biên dịch cho armv7.

+0

Tôi đang biên dịch cũng cho armv7, và tôi thực sự không hiểu tại sao bạn viết về Necessitas Qt Creator – Giuseppe

+1

Vì tôi đã mắc lỗi, xin lỗi :-) Tôi nhầm lẫn câu hỏi với câu hỏi khác trong đó Qt Creator đã được sử dụng. Dù sao, tôi đã có cùng một vấn đề chính xác khi cố gắng để tải một thư viện biên dịch cho armv5 trên một thiết bị armv7. Biên dịch cho armv5 làm cho nó hoạt động hoàn hảo, vì vậy tôi đã không điều tra thêm, nhưng tôi nghĩ rằng nó có thể giúp đỡ. –

1

Producing optimised NDK code for multiple architectures?

đọc về 'tay' vs 'ngón tay cái' trong câu trả lời được chấp nhận trong các liên kết ở trên.

sau đó, loại bỏ hướng dẫn cấu hình của bạn để xây dựng cho ngón tay cái và xác minh rằng bạn đang xây dựng cho cánh tay ...

HOẶC ...

bệnh làm cho một đoán hoang dã ... của thư viện theo thứ tự bạn có trong báo cáo mối liên kết trong báo cáo 'Android.mk'

thử diễn đàn google cho ndk ... tìm kiếm cho 'không thể xác định vị trí biểu tượng' ...

Thật tuyệt vọng?

xem mục 'Thời gian chạy lỗi' here

6

Các __gnu_thumb1_case_uqi là một helper mà làm một bước nhảy được lập chỉ mục trên một bảng công tắc dày đặc; nhanh chóng thực hiện công tắc. Bạn có hai lựa chọn: tránh nó hoặc liên kết với nó.

Nếu bạn tăng mức tối ưu hóa (bằng cách sử dụng -O3), bạn có thể không cần biểu tượng này. Ngoài ra, việc thay đổi CPU có thể hữu ích cũng như sử dụng hướng dẫn thumb2. Biên dịch với tùy chọn -ffreestanding cũng có thể tránh biểu tượng này. Nếu bạn có quyền kiểm soát câu lệnh switch, bạn có thể thay thế nó bằng một mảng các con trỏ hàm.

Thường trình này nằm trong số libgcc. Bạn có thể liên kết tĩnh libgcc. Ở đâu đó trong SDK/trình biên dịch Android, phải có libgcc.a. Liên kết với libgcc.a, sử dụng -L-l hoặc sử dụng tùy chọn liên kết -static-libgcc để nhận mã (xem http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html).

Chỉnh sửa: Nếu bạn không biên dịch bất kỳ thứ gì, bạn có thể tìm thấy libgcc.so trên hệ thống của mình. Nó có thể là trong /lib hoặc /usr/lib hoặc có lẽ một số nơi lạ đối với thiết bị Android. Thêm thư mục nơi libgcc.so được đặt vào biến môi trường LD_LIBRARY_PATH cũng có thể khắc phục được sự cố. Có thể không may là Samsung đã phát hành các tệp nhị phân không tương thích và bạn không có cách nào để khắc phục sự cố nếu bạn không biên dịch mã của riêng mình. Chính xác libgcc.so có thể bên trong một cái gì đó như /usr/lib/thumb cho các bản phân phối đa lib. Tôi không biết nhiều về công cụ của Davlik, nhưng JVM của Android có thể không trỏ đến tập hợp thư viện phù hợp khi nó chạy.

+0

Điều này chưa giải quyết được vấn đề cho tôi, nhưng đó là thông tin tốt ... –

+0

Thật không may, NDK không xuất '__gnu_thumb1_case_uqi' trong bất kỳ thư viện nào của nó. –

+0

NDK của chính nó có lẽ là sử dụng 'bionic'; một libc google, vì vậy libgcc.so có lẽ không phải là vấn đề, nhưng một số phiên bản thư viện 'bionic' không bao gồm nó, có thể bạn sẽ phải xây dựng với một NDK cũ hơn để không có biểu tượng. Tôi nghĩ rằng chức năng sẽ giống nhau trong 'bionic' như glibc; một tuyên bố chuyển đổi. –

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