studio - tag android
No se puede cargar la biblioteca: reloc_library[1285]: no se puede encontrar ''rand'' (3)
Esto sucede si ha creado sus componentes nativos con el objetivo
android-21
, pero está tratando de ejecutarlo en un dispositivo con una versión anterior de Android.
A menos que tenga especial cuidado, no puede ejecutar binarios creados con el objetivo
android-21
en dispositivos más antiguos.
Para las funciones básicas de C, no debería importar qué versión de destino entre
android-3
y
android-20
use, debería funcionar en todas ellas, pero si usa
android-21
solo funciona en esa versión y más nuevas.
Consulte https://stackoverflow.com/a/27093163/3115956 para obtener más detalles sobre este problema.
Estoy tratando de usar la biblioteca PJSIP para mi aplicación de Android. Construí la aplicación de muestra pjsua de acuerdo con este manual: https://trac.pjsip.org/repos/wiki/Getting-Started/Android
Pero cuando se inicia la aplicación de muestra, se activa la excepción:
12-06 15:03:58.043: D/dalvikvm(628): Trying to load lib /data/data/org.pjsip.pjsua2.app/lib/libpjsua2.so 0x4129d980
12-06 15:03:58.064: W/dalvikvm(628): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/pjsip/pjsua2/app/MyApp;
12-06 15:03:58.064: D/AndroidRuntime(628): Shutting down VM
12-06 15:03:58.064: W/dalvikvm(628): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
12-06 15:03:58.083: E/AndroidRuntime(628): FATAL EXCEPTION: main
12-06 15:03:58.083: E/AndroidRuntime(628): java.lang.ExceptionInInitializerError
12-06 15:03:58.083: E/AndroidRuntime(628): at org.pjsip.pjsua2.app.MainActivity.onCreate(MainActivity.java:85)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.Activity.performCreate(Activity.java:4465)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.access$600(ActivityThread.java:123)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.os.Handler.dispatchMessage(Handler.java:99)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.os.Looper.loop(Looper.java:137)
12-06 15:03:58.083: E/AndroidRuntime(628): at android.app.ActivityThread.main(ActivityThread.java:4424)
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.reflect.Method.invokeNative(Native Method)
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.reflect.Method.invoke(Method.java:511)
12-06 15:03:58.083: E/AndroidRuntime(628): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-06 15:03:58.083: E/AndroidRuntime(628): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-06 15:03:58.083: E/AndroidRuntime(628): at dalvik.system.NativeStart.main(Native Method)
12-06 15:03:58.083: E/AndroidRuntime(628): Caused by: java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1285]: 37 cannot locate ''rand''...
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.Runtime.loadLibrary(Runtime.java:370)
12-06 15:03:58.083: E/AndroidRuntime(628): at java.lang.System.loadLibrary(System.java:535)
12-06 15:03:58.083: E/AndroidRuntime(628): at org.pjsip.pjsua2.app.MyApp.<clinit>(MyApp.java:235)
Parece que appl no puede cargar la biblioteca libpjsua2.so. Nunca he usado el NDK antes, así que no tengo ninguna idea sobre este problema, por favor, ayúdenme ...
He encontrado esto cuando uso el teléfono HUAWEI con opus y pngquant jni library para android. Finalmente, la solución es que agrego implementaciones de funciones rand, srand y atof en mi archivo fuente. Entonces el problema desapareció.
Solución de https://github.com/cocos2d/cocos2d-x/issues/15234 Pruébelo!
static u_long myNextRandom = 1;
double atof(const char *nptr)
{
return (strtod(nptr, NULL));
}
int rand(void)
{
return (int)((myNextRandom = (1103515245 * myNextRandom) + 12345) % ((u_long)RAND_MAX + 1));
}
void srand(u_int seed)
{
myNextRandom = seed;
}
mstorsjo responde a mi pregunta. Pero quiero escribir un comentario: tenía los archivos de propiedades correctos, pero durante la construcción de pjsip encontré los siguientes registros:
sip@ubuntu:~/pjsip/trunk$ ./configure-android
configure-android: APP_PLATFORM not specified, using android-21
configure-android: TARGET_ABI not specified, using armeabi
Entonces, si desea compilar el proyecto en alguna versión de plataforma específica, debe establecer el parámetro APP_PLATFORM para el script configure-android.
TARGET_ABI=armeabi-v7a APP_PLATFORM=android-8 ./configure-android --use-ndk-cflags