2016-11-13 4 views
0

Я новичок в Android и потребовал от меня создать приложение с функциями на C++, они предоставили файлы * .so.Android не может связывать * .so lib

Я поставил * .so файлы в следующем каталоге:

src 
│    ├── main 
│    │   ├── java 
│    │   ├── jniLibs 
│    │   │   ├── armeabi 
│    │   │   │   ├── libjni_lib1.so 
│    │   │   │   ├── libjni_lib2.so 
│    │   │   │   ├── libjni_libn.so 

Y нагрузки это следующим образом:

static { 
    System.loadLibrary("jni_lib1"); 
} 

Но когда я отладки приложения, получить следующее сообщение об ошибке:

java.lang.UnsatisfiedLinkError: Native method not found: com.cloudpos.jniinterface.SmartCardInterface.smartcardInit:()I 
        at com.cloudpos.jniinterface.SmartCardInterface.smartcardInit(Native Method) 
        at cr.pf.com.controller.SmartCardController.searchBegin(SmartCardController.java:57) 
        at cr.pf.com.cr.MainActivity.onClick(MainActivity.java:134) 
        at android.view.View.performClick(View.java:4438) 
        at android.view.View$PerformClick.run(View.java:18439) 
        at android.os.Handler.handleCallback(Handler.java:733) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:136) 
        at android.app.ActivityThread.main(ActivityThread.java:5111) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:515) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:780) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:596) 
        at dalvik.system.NativeStart.main(Native Method) 

I/Process: сигнал отправки. PID: 5364 SIG: 9 Приложение прекращено.

Я уже читал, как добавлять файлы * .so, и только говорит, что все они помещаются в папки jniLibs, как я могу это сделать?

+1

1) .apk файлы являются zip-файлами, переименовывают ваш файл apk и разархивируют его, чтобы увидеть, внесли ли файлы .so в файл apk. 2) Пожалуйста, покажите файлы .h и .c/C++ с 'smartcardInit (...)'. 3) Java loadLibrary не загружает зависимые .so файлы, вам нужно загрузить самый зависимый .so файл 1-го, затем следующий самый зависимый .so-файл и т. Д. –

+0

Я уже это сделал, и я видел библиотеки в папке lib, Что еще я могу сделать? – mareyes

+0

Итак, вам это удалось? –

ответ

0

Если loadLibrary() не генерирует исключение, ваши файлы, скорее всего, установлены правильно. Я бы все же добавил log stttement после loadLibrary() - только чтобы убедиться, что этот статический конструктор был выполнен как и когда ожидалось.

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

Это может случиться, потому что Android поощряет нас использовать пакет Java так же, как имя пакета приложения, как указано в манифесте. Но вы можете использовать любое имя пакета Java для любого из ваших классов.

Вы можете использовать nm команду, которая распространяется с НКА, анализировать фактические имена экспортируемых функций .so и ожидаемый пакет Java может быть получен от этого.

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