Android: Unsatisfied link error

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Teknix1982
  • Registratie: Januari 2005
  • Niet online
Voor een klant van ons hebben wij een android app geschreven die werkt met UHF RFID en met een android besturingssysteem. De scanner is geleverd door panmobil en levert een keurige sample applicatie erbij voor het UHF deel. Wij hebben dit deel dan ook werkend gekregen. Echter zit er ook een barcode module op de scanner die we ook willen gebruiken. Ik heb al vaker met verschillende barcode modules gewerkt en nog nooit echt problemen gehad. Echter panmobil heeft voor het barcode deel een wat lastigere sample applicatie geleverd. Deze sample applicatie bevat een eigen gemaakt keyboard voor android om vanaf daar ook de barcode module aan te spreken en de gelezen data als input in een tekstveld te plaatsen. Ze spreken de serialport aan met een eigen C library waar ik de broncodes niet van heb, die ze via System.Load() laden en vervolgens als native method gebruiken.

Mijn vraag
Nu ben ik bezig met de sample code om hem draaiend te maken en de barcode module te implementeren in mijn eigen app. Ik loop echter steeds tegen dezelfde fout aan in hun sample project. Hij laad de library wel in maar geeft toch een unsatified link error. Weet iemand wat er eventueel fout kan zijn of waar ik het nog meer kan zoeken?

Hieronder een dump van de foutmelding:
03-02 13:35:31.132 11825-11825/com.example.uartdemo D/dalvikvm: Trying to load lib /data/data/com.example.uartdemo/lib/libdevapi.so 0x41eacd68
03-02 13:35:31.132 11825-11825/com.example.uartdemo D/dalvikvm: Added shared lib /data/data/com.example.uartdemo/lib/libdevapi.so 0x41eacd68
03-02 13:35:31.132 11825-11825/com.example.uartdemo D/dalvikvm: No JNI_OnLoad found in /data/data/com.example.uartdemo/lib/libdevapi.so 0x41eacd68, skipping init
03-02 13:35:31.132 11825-11825/com.example.uartdemo D/dalvikvm: Trying to load lib /data/data/com.example.uartdemo/lib/libSerialPort.so 0x41eacd68
03-02 13:35:31.133 11825-11825/com.example.uartdemo D/dalvikvm: Added shared lib /data/data/com.example.uartdemo/lib/libSerialPort.so 0x41eacd68
03-02 13:35:31.133 11825-11825/com.example.uartdemo D/dalvikvm: No JNI_OnLoad found in /data/data/com.example.uartdemo/lib/libSerialPort.so 0x41eacd68, skipping init
03-02 13:35:31.133 11825-11825/com.example.uartdemo W/dalvikvm: No implementation found for native Lcom/example/uartdemo/SerialPort;.scanerpoweron:()V
03-02 13:35:31.134 11825-11825/com.example.uartdemo D/AndroidRuntime: Shutting down VM
03-02 13:35:31.134 11825-11825/com.example.uartdemo D/dalvikvm: threadid=1: detach (group=0x418d9ce0)
03-02 13:35:31.134 11825-11825/com.example.uartdemo W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x418d9ce0)
03-02 13:35:31.134 11825-11825/com.example.uartdemo W/dalvikvm: threadid=1: uncaught exception occurred
03-02 13:35:31.134 11825-11825/com.example.uartdemo W/System.err: java.lang.UnsatisfiedLinkError: Native method not found: com.example.uartdemo.SerialPort.scanerpoweron:()V
03-02 13:35:31.141 11825-11847/com.example.uartdemo D/dalvikvm: threadid=12: notify debugger
03-02 13:35:31.141 11825-11847/com.example.uartdemo D/dalvikvm: threadid=12 (Thread-330): calling run()
03-02 13:35:31.142 11825-11845/com.example.uartdemo D/dalvikvm: threadid=13: interp stack at 0x5524b000
03-02 13:35:31.142 11825-11845/com.example.uartdemo D/dalvikvm: threadid=13: adding to list (attached)
03-02 13:35:31.143 11825-11845/com.example.uartdemo D/dalvikvm: threadid=13: attached from native, name=SoundPool
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at com.example.uartdemo.SerialPort.scanerpoweron(Native Method)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at com.example.uartdemo.SerialPort.scaner_poweron(SerialPort.java:147)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at com.example.uartdemo.SerialPort.<init>(SerialPort.java:53)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at com.panmobil.panmobilkeyboard.SoftKeyboard.onCreate(SoftKeyboard.java:80)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at android.app.ActivityThread.handleCreateService(ActivityThread.java:2731)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at android.app.ActivityThread.access$1800(ActivityThread.java:151)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at android.os.Handler.dispatchMessage(Handler.java:110)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at android.os.Looper.loop(Looper.java:193)
03-02 13:35:31.144 11825-11825/com.example.uartdemo W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5299)
03-02 13:35:31.145 11825-11825/com.example.uartdemo W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
03-02 13:35:31.146 11825-11825/com.example.uartdemo W/System.err: at java.lang.reflect.Method.invoke(Method.java:515)
03-02 13:35:31.148 11825-11825/com.example.uartdemo W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
03-02 13:35:31.156 11825-11825/com.example.uartdemo W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
03-02 13:35:31.156 11825-11825/com.example.uartdemo W/System.err: at dalvik.system.NativeStart.main(Native Method)
03-02 13:35:31.156 11825-11825/com.example.uartdemo W/dalvikvm: threadid=1: calling UncaughtExceptionHandler
03-02 13:35:31.176 11825-11825/com.example.uartdemo E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.uartdemo, PID: 11825
java.lang.UnsatisfiedLinkError: Native method not found: com.example.uartdemo.SerialPort.scanerpoweron:()V
at com.example.uartdemo.SerialPort.scanerpoweron(Native Method)
at com.example.uartdemo.SerialPort.scaner_poweron(SerialPort.java:147)
at com.example.uartdemo.SerialPort.<init>(SerialPort.java:53)
at com.panmobil.panmobilkeyboard.SoftKeyboard.onCreate(SoftKeyboard.java:80)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2731)
at android.app.ActivityThread.access$1800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1403)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
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:825)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
at dalvik.system.NativeStart.main(Native Method)
Relevante software en hardware die ik gebruik
Ik werk met Android Studio 2.2.3, Android SDK 23 en een scanner van panmobil met Android 4.4.2

Wat ik al gevonden of geprobeerd heb
Ik heb veel op stackoverflow rondgezocht over de error. Eerst was het probleem dat Android de .so bestanden niet kon inladen. Nadat bleek dat ze een AndroidManifest hadden meegeleverd met een package name name.your.own dus zocht android ze de libraries op de verkeerde plek. Nadat ik de juiste package naam ingesteld had vond android de libraries als ook in de log blijkt maar de native methods nog steeds niet. Ik heb weinig ervaring hiermee dus ik vermoed dat er nog iets ingesteld moet worden in mijn project waardoor de methodes ook goed gevonden kunnen worden. Panmobil is niet bereid mee te denken en de leverancier die ze geleverd heeft geeft aan niet verder te kunnen helpen.

Beste antwoord (via Teknix1982 op 03-03-2017 14:51)


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 05:43
Kun je eerst eens kijken welke functies precies gedefinieerd zijn in libSerialPort.so? Als je onder Linux werkt, kun je 'm van de telefoon download met adb pull en symbols dumpen met objdump -T:
adb pull /data/data/com.example.uartdemo/lib/libSerialPort.so
objdump -T libSerialPort.so

De symbol die je zoekt heet (denk ik) Java_com_example_uartdemo_SerialPort_scanerpoweron.

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 05:43
Kun je eerst eens kijken welke functies precies gedefinieerd zijn in libSerialPort.so? Als je onder Linux werkt, kun je 'm van de telefoon download met adb pull en symbols dumpen met objdump -T:
adb pull /data/data/com.example.uartdemo/lib/libSerialPort.so
objdump -T libSerialPort.so

De symbol die je zoekt heet (denk ik) Java_com_example_uartdemo_SerialPort_scanerpoweron.

Acties:
  • 0 Henk 'm!

  • Teknix1982
  • Registratie: Januari 2005
  • Niet online
Soultaker schreef op vrijdag 3 maart 2017 @ 11:38:
Kun je eerst eens kijken welke functies precies gedefinieerd zijn in libSerialPort.so? Als je onder Linux werkt, kun je 'm van de telefoon download met adb pull en symbols dumpen met objdump -T:
adb pull /data/data/com.example.uartdemo/lib/libSerialPort.so
objdump -T libSerialPort.so

De symbol die je zoekt heet (denk ik) Java_com_example_uartdemo_SerialPort_scanerpoweron.
Dank je voor jouw reactie. Ik heb geen linux maar heb objdump voor windows opgezocht. Dit is het resultaat
libSerialPort.so: file format elf32-little

DYNAMIC SYMBOL TABLE:
00000000 DF *UND* 00000000 __cxa_finalize
00000000 DF *UND* 00000000 __cxa_atexit
00000fc5 g DF .text 000000a0 Java_com_rfid_uhfservice_SerialPort_open
00000000 DF *UND* 00000000 h900_uart_open
00000000 DF *UND* 00000000 __android_log_print
0000197c g DF .text 00000008 __aeabi_unwind_cpp_pr0
00001065 g DF .text 00000088 Java_com_rfid_uhfservice_SerialPort_close
00000000 DF *UND* 00000000 h900_uart_close
000010ed g DF .text 00000008 Java_com_rfid_uhfservice_SerialPort_scanerpoweron
00000000 DF *UND* 00000000 h900_scaner_power_on
00001974 w DF .text 00000008 __aeabi_unwind_cpp_pr1
000010f5 g DF .text 00000008 Java_com_rfid_uhfservice_SerialPort_scanerpoweroff
00000000 DF *UND* 00000000 h900_scaner_power_off
000010fd g DF .text 00000008 Java_com_rfid_uhfservice_SerialPort_scanertrigeron
00000000 DF *UND* 00000000 h900_scaner_trig_on
00001105 g DF .text 00000008 Java_com_rfid_uhfservice_SerialPort_scanertrigeroff
00000000 DF *UND* 00000000 h900_scaner_trig_off
0000110d g DF .text 0000002c Java_com_rfid_uhfservice_SerialPort_stringinject
00000000 DF *UND* 00000000 mc90_ascii_inject
00000000 w DF *UND* 00000000 __gnu_Unwind_Find_exidx
0000196c w DF .text 00000008 __aeabi_unwind_cpp_pr2
00001f38 g DF .text 00000000 __gnu_Unwind_Restore_VFP_D
00001f28 g DF .text 00000000 __gnu_Unwind_Restore_VFP
00001f48 g DF .text 00000000 __gnu_Unwind_Restore_VFP_D_16_to_31
00001f58 g DF .text 00000000 __gnu_Unwind_Restore_WMMXD
00001fe0 g DF .text 00000000 __gnu_Unwind_Restore_WMMXC
00000000 DF *UND* 00000000 memcpy
00001f14 g DF .text 00000014 restore_core_regs
00000000 DF *UND* 00000000 abort
000014fc g DF .text 00000044 _Unwind_VRS_Get
00001568 g DF .text 00000044 _Unwind_VRS_Set
00000000 w D *UND* 00000000 __cxa_begin_cleanup
00000000 w D *UND* 00000000 __cxa_type_match
00002114 g DF .text 00000394 __gnu_unwind_execute
00000000 w D *UND* 00000000 __cxa_call_unexpected
00001984 g DF .text 00000358 _Unwind_VRS_Pop
00001f40 g DF .text 00000000 __gnu_Unwind_Save_VFP_D
00001f30 g DF .text 00000000 __gnu_Unwind_Save_VFP
00001f50 g DF .text 00000000 __gnu_Unwind_Save_VFP_D_16_to_31
00001f9c g DF .text 00000000 __gnu_Unwind_Save_WMMXD
00001ff4 g DF .text 00000000 __gnu_Unwind_Save_WMMXC
00001cdc g DF .text 00000008 _Unwind_GetCFA
00001ce4 g DF .text 000000a4 __gnu_Unwind_RaiseException
00001d88 g DF .text 0000001c __gnu_Unwind_ForcedUnwind
00001da4 g DF .text 0000006c __gnu_Unwind_Resume
00001e10 g DF .text 00000020 __gnu_Unwind_Resume_or_Rethrow
00001e30 g DF .text 00000004 _Unwind_Complete
00001e34 g DF .text 00000020 _Unwind_DeleteException
00001e54 g DF .text 000000c0 __gnu_Unwind_Backtrace
00001f14 g DF .text 00000014 __restore_core_regs
00002008 g DF .text 00000024 ___Unwind_RaiseException
00002008 g DF .text 00000024 _Unwind_RaiseException
0000202c g DF .text 00000024 ___Unwind_Resume
0000202c g DF .text 00000024 _Unwind_Resume
00002050 g DF .text 00000024 ___Unwind_Resume_or_Rethrow
00002050 g DF .text 00000024 _Unwind_Resume_or_Rethrow
00002074 g DF .text 00000024 ___Unwind_ForcedUnwind
00002074 g DF .text 00000024 _Unwind_ForcedUnwind
00002098 g DF .text 00000024 ___Unwind_Backtrace
00002098 g DF .text 00000024 _Unwind_Backtrace
000024a8 g DF .text 00000040 __gnu_unwind_frame
000024e8 g DF .text 0000002c _Unwind_GetRegionStart
00002514 g DF .text 00000038 _Unwind_GetLanguageSpecificData
0000254c g DF .text 00000008 _Unwind_GetDataRelBase
00002554 g DF .text 00000008 _Unwind_GetTextRelBase
00004004 g D *ABS* 00000000 _edata
00004004 g D *ABS* 00000000 __bss_start
00004004 g D *ABS* 00000000 _end
Wat me opvalt is dat hier de package heel anders heet:

Java_com_rfid_uhfservice_SerialPort_scanerpoweron

Ik ga nu de package hernoemen naar bovenstaande en kijken of het dan wel werkt.

Edit:

Oke dit was het probleem. De SerialPort class die de native methods gebruikte had de package com.example.uartdemo maar had de package com.rfid.uhfservice moeten hebben. Wel vreemd dat de leverancier dit zo aanlevert maargoed ik had nog te weinig ervaringen met externe libraries in Android. Weer wat geleerd.

[ Voor 3% gewijzigd door Teknix1982 op 03-03-2017 14:51 ]