2014-12-07 11 views
21

Android uygulamam için PJSIP kütüphanesini kullanmaya çalışıyorum. Ben bu kılavuza uygun pjsua örnek uygulama inşa: örnek uygulama başlatıyor zaman https://trac.pjsip.org/repos/wiki/Getting-Started/AndroidKitaplık yüklenemiyor: reloc_library [1285]: 'rand' bulunamıyor

Ama istisna tetikler: libpjsua2.so kütüphane yükleyemiyor İçi gibi görünüyor

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) 

. Daha önce hiç NDK kullanmamıştım, bu yüzden bu konuda herhangi bir fikrim yok, lütfen bana yardım edin ...

+0

Olası yinelenen [Android'in NDK kullanarak mkfifo nasıl kullanılacağını] (http://stackoverflow.com/questions/27091001/how-to-use-mkfifo-using-androids-ndk). – jww

+0

[Zayıf semboller] (http://en.wikipedia.org/wiki/Weak_symbol) bu sorunu çözebilmelidir. Ancak Android, ön işlemcideki '__GXX_WEAK__' öğesini tanımlasa da Android üzerinde çalıştıklarına ikna olmadım. [OS X ve Android arasında paylaşılan kütüphanede zayıf işlevini geçersiz kılmanın farklı davranışı] (http://stackoverflow.com/q/20196368/608639) ve [Android'in zayıf sembollerini destekliyor mu?] (Http://stackoverflow.com/ q/27935228/608639). – jww

cevap

28

Bu, yerel bileşenlerinizi android-21 hedefiyle oluşturduysanız ancak çalıştırmaya çalışıyorsanız bu olur eski bir Android sürümü olan bir cihazda. Çok özel bir özen göstermedikçe, eski cihazlarda android-21 hedefiyle oluşturulmuş ikili dosyaları çalıştıramazsınız. Temel C işlevleri için, kullandığınız android-3 ve android-20 arasındaki hangi hedef sürümün kullanıldığının önemi yoktur, bunların hepsinde çalışmalıdır, ancak android-21 kullanırsanız, yalnızca bu sürümde ve daha yeni sürümlerde çalışır.

Bu konu hakkında daha fazla ayrıntı için https://stackoverflow.com/a/27093163/3115956 adresine bakın.

+0

"Temel C işlevleri için önemli olmamalı ..." Bu, çoğunlukla satır içi olarak tanımlanmışsa ve bunları şimdi doğru sembollere tanıtmış olsaydı, çoğunlukla doğrudur. Elde tam bir liste yok, ama iirc 'rand' onlardan biriydi. –

+0

Evet, yorumum, android-21'de gerçekten değişen normal C işlevlerinin, android-3 ve android-20 arasında herhangi bir değişiklik yapmadığı anlamına geliyordu. Böylece android-20 (veya android-9) başlıklarını kullanarak kolayca oluşturabilirsiniz. Eğer hala android-3 üzerinde çalışabilirken OpenSL ES (dlsym kullanarak dinamik olarak yüklenmiş veya ayrı bir .so) kullanan koşullu olarak kullanılan bir kod yoluna sahip olmak istiyorsanız. – mstorsjo

+0

PJSIP için Android örnek uygulaması hedef SDK sürüm 15'e sahip ve API düzeyi 15 ile AVD emülatöründe başlatmaya çalışıyorum. Bu yüzden kök neden değil. –

11

mstorsjo sorumu yanıtlıyor. Ama bir görüş bildirmek istiyorum: Doğru özellikleri dosyaları vardı, ama pjsip binanın sırasında ben şu günlükleri bulundu: Bazı belirli bir platform sürümüne projeyi derlemek istiyorsanız

[email protected]:~/pjsip/trunk$ ./configure-android 
configure-android: APP_PLATFORM not specified, using android-21 
configure-android: TARGET_ABI not specified, using armeabi 

, sizin için APP_PLATFORM parametresini ayarlamak zorunda configure-android komut dosyası.

TARGET_ABI=armeabi-v7a APP_PLATFORM=android-8 ./configure-android --use-ndk-cflags 
+0

Ben sadece ekleyin APP_PLATFORM = android-19 – JMR

+1

Cool! Ama yeterli değil. Ayrıca, yeniden ciltleme bağları. * Pjsip-apps/src/swig/* için 'make clean && make' yazın. – DenisKolodin

+0

build.gradle'da APP_PLATFORM nasıl eklenir? – Jitendra

3

Android için opus ve pngquant jni kitaplığı ile HUAWEI telefonu kullanırken bunu gördüm. Son olarak, çözüm, kaynak dosyama rand, srand ve atof işlevi eklemeleri eklemem. Sonra sorun gitti.

https://github.com/cocos2d/cocos2d-x/issues/15234 dan Çözümü deneyin! arasında

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; 
} 
İlgili konular