2015-09-30 2 views
0

Когда я использую System.loadLibrary() загрузить мой файл так, редко, он терпит неудачу и Logcat говоритандроид библиотека загрузка не удалась

Cannot load library: reloc_library[1286]: 121 cannot locate '__cxa_atexit' 
java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 169 cannot locate '__cxa_atexit'... 
at java.lang.Runtime.loadLibrary(Runtime.java:370) 
at java.lang.System.loadLibrary(System.java:535) 

После поиска в Интернете, я не нахожу детали о

cannot locate '__cxa_atexit' 

(особенно ключевое слово __cxa_atexit). Почему не удается найти эту функцию? Эта функция, похоже, находится в libc.so. Я не использую C++ в своем родном коде, только C. Моя версия NDK - это android-ndk-r10e. Я думаю, что «не может найти __cxa_atexit», может быть, относительный ключ.

В большинстве случаев (возможно, миллиарды запусков приложения), он может работать хорошо, но редко падает, как указано выше. Другими словами, я не могу сделать это сбоем на своих тестирующих телефонах, однако он редко срабатывает на некоторых пользователях.

Эта проблема может быть такой же, как another problem.

UPDATE

Большинство телефонов, этот сбой происходит на это Android 4.0.3 и Android 4.0.4. Эти две версии являются API-15.

UPDATE

После чтения исходного кода некоторых Андроида, я нашел этот вопрос может быть связан с dlopen. Сообщение об ошибке «Невозможно загрузить библиотеку: reloc_library ...» происходит из функции dlopen, которая была захвачена во время выполнения. Трассировка: runtime dlopen -> find_library -> init_library -> link_image -> reloc_library.

Возможно, когда он разрешит символы в моих файлах, он обнаруживает, что «__cxa_atexit» не определен. Затем он просматривает загруженные символы, но ничего не находит. (Почему не может найти __cxa_atexit?) Наконец, бежит к линии 1285 с кодом:

DL_ERR("%5d cannot locate '%s'...\n", pid, sym_name); 

Я не знаю, что-то о линкере. Может ли кто-нибудь объяснить или догадаться, почему __cxa_atexit не может быть найден? Это ошибка Android?

UPDATE

Он падает на ВСЕХ Android версии не только 4.0.3 & 4.0.4.

Сообщение об ошибке на 4.0.3 & 4.0.4

java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: 121 cannot locate '__cxa_atexit' 

, как упомянуто выше.

При загрузке какой-либо другой так далее 4.0.3 & 4.0.4, это

cannot locate 'strcpy' 

Сообщение об ошибке на 4.2.2 является

java.lang.UnsatisfiedLinkError: Cannot load library: load_library(linker.cpp:767): can't read file /mnt/asec/app-name-1/lib/libname.so: I/O error 
+0

Вы видели http: // stackoverflow .com/вопросы/32425865/race-condition-in-android-dlopen/32460683 # 32460683? – 18446744073709551615

+0

Это не те же проблемы. Я также использую «System.loadlibrary()», как вы отметили. и если это не удается, я разархивирую файл из apk и перезагружаю его. В большинстве случаев он может работать хорошо, но иногда сбой. Другими словами, я не могу сделать это сбоем на моем собственном телефоне, однако он падает на других пользователей, которые используют мое приложение. – homelesser

+0

попробуйте это: http: //stackoverflow.com/questions/15204492/system-loadlibrary-error – KishuDroid

ответ

0

Во-первых, убедитесь, что вы назвали System ,LoadLibrary(), как показано ниже:

public class MainActivity extends Activity { 
    static { 
     System.loadLibrary("main") 
    } 
    ... 
} 

Тогда, согласно the second answer in this post, проблемы была с некоторыми внешними зависимостями, которые были загружены статический в вашей родной библиотеке. Они только висели на Android 4.0 и работали нормально 4.2 и выше. Поэтому вы должны проверить свой файл.

я просто положил свой ответ здесь:

если у вас есть проблемы, поставить __android_log_print в JNI_onLoad вашей библиотеки (если у вас есть). Если он не вызывается, проверьте все функции, которые можно вызвать статически (остерегайтесь, некоторые могут быть скрыты за макросами) и попытайтесь удалить их, чтобы узнать, можете ли вы загрузить библиотеку.

+0

Он будет рушиться редко, если я вызову System.loadLibrary(), как ваш. Я попробовал другой путь. Когда я создаю один экземпляр, я вызываю System.loadLibrary(), если возникает сбой, я разархивирую файл из файла apk и вызываю System.load(). Однако это не поможет. Кстати, он падает во многих версиях android os (4.0.3 - 5.1) и проще на 4.0.3 и 4.0.4 сравнительно. – homelesser

+0

Я обновляю вопрос. Любая идея о __cxa_atexit? – homelesser

+0

Поскольку вы редко можете загружать библиотеку в большинстве случаев и аварийно, я предлагаю вам отлаживать вашу библиотеку (если у вас есть исходный код), некоторые внешние зависимости, загруженные в вашу библиотеку, могут вызвать проблему. –

Смежные вопросы