Android fixes an ERROR disconnecting a stream with interpolation frames (count = 28)

I am doing an android project and I need to integrate Spotify streaming features. Now I can load dynamic libraries and call functions, but there are some problems.

callbacks.notify_main_thread = callback_notify_main_thread; config.callbacks = &callbacks; error = sp_session_create(&config, &session); 

Then in the notify_main_thread callback function it will be:

 vm->AttachCurrentThread( &env, NULL ); vm->DetachCurrentThread(); 

This callback function is still in the native thread created by Spotify with code (see the question "According to the documentation, some callbacks are called from the" internal "session thread. What does this mean?").

So, first I attach the current thread to javaVM and get JNIEnv, then call the java methods and then disconnect it. But when running DetachCurrentThread it will work:

 10-23 14:55:21.869: E/dalvikvm(1000): ERROR: detaching thread with interp frames (count=28) 10-23 14:55:21.869: I/dalvikvm(1000): "main" prio=5 tid=1 RUNNABLE 10-23 14:55:21.869: I/dalvikvm(1000): | group="main" sCount=0 dsCount=0 s=N obj=0x40025ad8 self=0xcd80 10-23 14:55:21.869: I/dalvikvm(1000): | sysTid=1000 nice=0 sched=0/0 cgrp=default handle=-1345017808 10-23 14:55:21.869: I/dalvikvm(1000): | schedstat=( 523773188 356262213 1690 ) 10-23 14:55:21.869: I/dalvikvm(1000): at com.Spotify.Session.Initialise(Native Method) ... 10-23 14:55:21.869: E/dalvikvm(1000): VM aborting 10-23 14:55:21.899: D/RegisterService(519): insert plugin size 1 10-23 14:55:21.958: D/RegisterService(519): insert plugin size 1 10-23 14:55:21.979: I/DEBUG(64): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 10-23 14:55:21.979: I/DEBUG(64): Build fingerprint: 'htc_wwe/htc_bravo/bravo/bravo:2.2.2/FRG83G/345208.14:user/release-keys' 10-23 14:55:21.979: I/DEBUG(64): pid: 1000, tid: 1000 >>> <<< 10-23 14:55:21.979: I/DEBUG(64): signal 11 (SIGSEGV), fault addr deadd00d 10-23 14:55:21.979: I/DEBUG(64): r0 00000026 r1 afd14699 r2 afd14699 r3 00000000 10-23 14:55:21.979: I/DEBUG(64): r4 808a3448 r5 808a3448 r6 fffe9544 r7 fffe2054 10-23 14:55:21.979: I/DEBUG(64): r8 80b09f04 r9 00000001 10 002f0980 fp 002f0980 10-23 14:55:21.979: I/DEBUG(64): ip deadd00d sp beffb088 lr afd156e3 pc 80842560 cpsr 20000030 10-23 14:55:21.979: I/DEBUG(64): d0 6472656767756265 d1 617453657669746e 10-23 14:55:21.979: I/DEBUG(64): d2 4965746f67795a67 d3 6874654d2474690a 10-23 14:55:21.979: I/DEBUG(64): d4 80a0a16580a0a179 d5 80a0a14580a0a155 10-23 14:55:21.979: I/DEBUG(64): d6 80a0a12180a0a135 d7 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d8 40b0000040a00000 d9 0000000000000005 10-23 14:55:21.979: I/DEBUG(64): d10 0000000000000000 d11 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d12 0000000000000000 d13 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d14 0000000000000000 d15 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d16 001512f000000025 d17 bff0000000000000 10-23 14:55:21.979: I/DEBUG(64): d18 3ff0000000000000 d19 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d20 0000000000000000 d21 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d22 3ff0000000000000 d23 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d24 3ff0000000000000 d25 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d26 0000000000000000 d27 0000000000000000 10-23 14:55:21.979: I/DEBUG(64): d28 001f001f001f001e d29 001e001f001f001f 10-23 14:55:21.979: I/DEBUG(64): d30 001f001f001f001f d31 001f001f001f001f 10-23 14:55:21.979: I/DEBUG(64): scr 60000012 10-23 14:55:21.999: I/DEBUG(64): #00 pc 00042560 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): #01 pc 0004fe6e /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): #02 pc 000455c2 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): #03 pc 000088aa /data/data/xxx/lib/xxx.so 10-23 14:55:21.999: I/DEBUG(64): #04 pc 00008bb2 /data/data/xxx/lib/xxx.so 10-23 14:55:21.999: I/DEBUG(64): #05 pc 0000a1e8 /data/data/xxx/lib/xxx.so 10-23 14:55:21.999: I/DEBUG(64): code around pc: 10-23 14:55:21.999: I/DEBUG(64): 80842540 20061861 f7d418a2 2000ea54 ebb2f7d4 10-23 14:55:21.999: I/DEBUG(64): 80842550 58234808 b1036bdb f8df4798 2026c01c 10-23 14:55:21.999: I/DEBUG(64): 80842560 0000f88c ec18f7d4 00060f0c fffe2054 10-23 14:55:21.999: I/DEBUG(64): 80842570 fffe52c8 000003a8 deadd00d f8dfb40e 10-23 14:55:21.999: I/DEBUG(64): 80842580 b503c02c bf00490a 188ba200 f853aa03 10-23 14:55:21.999: I/DEBUG(64): code around lr: 10-23 14:55:21.999: I/DEBUG(64): afd156c0 b5f74b0d 490da200 2600189b 585c4602 10-23 14:55:21.999: I/DEBUG(64): afd156d0 686768a5 f9b5e008 b120000c 46289201 10-23 14:55:21.999: I/DEBUG(64): afd156e0 9a014790 35544306 37fff117 6824d5f3 10-23 14:55:21.999: I/DEBUG(64): afd156f0 d1ed2c00 bdfe4630 0002cc60 000000d8 10-23 14:55:21.999: I/DEBUG(64): afd15700 b086b570 f602fb01 9004460c a804a901 10-23 14:55:21.999: I/DEBUG(64): stack: 10-23 14:55:21.999: I/DEBUG(64): beffb048 00000015 10-23 14:55:21.999: I/DEBUG(64): beffb04c afd146c9 /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb050 afd425a0 /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb054 afd4254c /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb058 00000000 10-23 14:55:21.999: I/DEBUG(64): beffb05c afd156e3 /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb060 afd14699 /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb064 afd14699 /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb068 afd146f0 /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb06c 808a3448 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): beffb070 808a3448 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): beffb074 fffe9544 10-23 14:55:21.999: I/DEBUG(64): beffb078 fffe2054 10-23 14:55:21.999: I/DEBUG(64): beffb07c afd146fd /system/lib/libc.so 10-23 14:55:21.999: I/DEBUG(64): beffb080 df002777 10-23 14:55:21.999: I/DEBUG(64): beffb084 e3a070ad 10-23 14:55:21.999: I/DEBUG(64): #00 beffb088 0000cd80 [heap] 10-23 14:55:21.999: I/DEBUG(64): beffb08c 8084fe73 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): #01 beffb090 0000cd80 [heap] 10-23 14:55:21.999: I/DEBUG(64): beffb094 4635cdd8 /dev/ashmem/mspace/dalvik-heap/2 (deleted) 10-23 14:55:21.999: I/DEBUG(64): beffb098 0000cd80 [heap] 10-23 14:55:21.999: I/DEBUG(64): beffb09c 00000001 10-23 14:55:21.999: I/DEBUG(64): beffb0a0 00000007 10-23 14:55:21.999: I/DEBUG(64): beffb0a4 808494c1 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): beffb0a8 80b09f04 /data/data/xxx/lib/xxx.so 10-23 14:55:21.999: I/DEBUG(64): beffb0ac 80848655 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): beffb0b0 80b09aa8 /data/data/xxx/lib/xxx.so 10-23 14:55:21.999: I/DEBUG(64): beffb0b4 41a9e564 /dev/ashmem/dalvik-LinearAlloc (deleted) 10-23 14:55:21.999: I/DEBUG(64): beffb0b8 808494c1 /system/lib/libdvm.so 10-23 14:55:21.999: I/DEBUG(64): beffb0bc 808455c7 /system/lib/libdvm.so 10-23 14:55:22.239: I/ActivityManager(96): Process xxx (pid 1000) has died. 

and if

 //vm->DetachCurrentThread(); 

then sp_session_create () is called, it will never return an error code.

Literature:

+4
source share
2 answers

The problem is resolved, I used javaVM-> GetEnv () to check if the current thread is already attached to vm, instead of directly attaching the thread and getting JNIEnv.

+3
source

Since you only need to disconnect the streams that you connected, you can quite easily avoid this problem by using the tips in the "Themes" section, the JNI developer tips for Android developers page . To attach threads that you call from the third library, it is probably easiest to immediately attach a โ€œbefore dyingโ€ callback to the stream when you bind it and detach it from there. Something like this (C ++ "pseudo"):

 pthread_key_t CallbackListener::current_env_key; ... JNIEnv * CallbackListener::getEnv() { JNIEnv *env; if ((env = (JNIEnv *)pthread_getspecific(current_env_key)) == NULL) { env = YourJavaThreadUtils::attachCurrentThreadToJVM(kCallbackThreadName); pthread_key_create(&current_env_key, CallbackListener::detach); pthread_setspecific(current_env_key, env); } return env; } ... void CallbackListener::detach(void *env) { YourJavaThreadUtils::detatchCurrentThreadFromJVM(); } 
+1
source

Source: https://habr.com/ru/post/1441516/


All Articles