web-dev-qa-db-ja.com

ライブラリを読み込めません:reloc_library [1285]: 'Rand'が見つかりません

私のAndroidアプリケーションにPJSIPライブラリを使用しようとしています。このマニュアルに従ってpjsuaサンプルアプリケーションをビルドしました: https://trac.pjsip.org/repos/wiki/ Getting-Started/Android

しかし、サンプルアプリケーションの起動時に、例外がトリガーされます。

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)

Applがlibpjsua2.soライブラリをロードできないようです。私はこれまでNDKを使用したことがないので、この問題についての考えはありません。助けてください...

21
Anton Galkin

これは、Android-21ターゲットを使用してネイティブコンポーネントをビルドしたものの、古いバージョンのAndroid=のデバイスで実行しようとしている場合に発生します。特別な注意を払わない限り、古いデバイスでは、Android-21ターゲットでビルドされたバイナリを実行できません。基本的なC関数の場合、Android-3Android-20の間のどのターゲットバージョンを使用しても問題ありません。すべてのバージョンで使用できますが、Android-21を使用する場合は、そのバージョン以降でのみ機能します。

この問題の詳細については、 https://stackoverflow.com/a/27093163/3115956 を参照してください。

30
mstorsjo

mstorsjoが私の質問に答えます。しかし、私は1つのコメントを書きたいと思います。正しいプロパティファイルがありましたが、pjsipのビルド中に次のログが見つかりました。

sip@ubuntu:~/pjsip/trunk$ ./configure-Android
configure-Android: APP_PLATFORM not specified, using Android-21
configure-Android: TARGET_ABI not specified, using armeabi

そのため、特定のプラットフォームバージョンでプロジェクトをコンパイルする場合は、configure-AndroidスクリプトのAPP_PLATFORMパラメータを設定する必要があります。

TARGET_ABI=armeabi-v7a APP_PLATFORM=Android-8 ./configure-Android --use-ndk-cflags
11
Anton Galkin

Android向けのopusおよびpngquant jniライブラリでHUAWEI電話を使用しているときに、これに遭遇しました。最後の解決策は、Rand、srand、およびatof関数の実装をソースファイルに追加することです。その後、問題はなくなりました。

https://github.com/cocos2d/cocos2d-x/issues/15234 からの解決策

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;
}
3
W. X