2014-12-07 12 views
21

मैं अपने एंड्रॉइड एप्लिकेशन के लिए पीजेएसआईपी लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। मैं इस पुस्तिका के अनुसार pjsua नमूना आवेदन बनाया: https://trac.pjsip.org/repos/wiki/Getting-Started/Androidलाइब्रेरी लोड नहीं कर सकता: reloc_library [1285]: 'rand' का पता नहीं लगा सकता

लेकिन जब नमूना आवेदन लॉन्च कर रहा है, अपवाद से चलाता है:

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 लाइब्रेरी लोड नहीं कर सकते हैं। मैंने पहले कभी एनडीके का उपयोग नहीं किया है, इसलिए मेरे पास इस मुद्दे के बारे में कोई विचार नहीं है, कृपया मेरी मदद करें ...

+0

संभावित डुप्लिकेट [एंड्रॉयड के NDK का उपयोग कर mkfifo उपयोग करने के लिए कैसे] (http://stackoverflow.com/questions/27091001/how-to-use-mkfifo-using-androids-ndk)। – jww

+0

[कमजोर प्रतीक] (http://en.wikipedia.org/wiki/Weak_symbol) इस समस्या को हल करने में सक्षम होना चाहिए। लेकिन मुझे विश्वास नहीं है कि वे एंड्रॉइड पर काम करते हैं, भले ही एंड्रॉइड प्रीप्रोसेसर में '__GXX_WEAK__' को परिभाषित करता है। देखें [ओएस एक्स और एंड्रॉइड के बीच साझा लाइब्रेरी में कमजोर फ़ंक्शन को ओवरराइड करने के विभिन्न व्यवहार] (http://stackoverflow.com/q/20196368/608639) और [एंड्रॉइड कमजोर प्रतीकों का समर्थन करता है?] (Http://stackoverflow.com/ क्यू/27935228/६,०८,६३९)। – jww

उत्तर

28

ऐसा होता है यदि आपने अपने मूल घटकों को android-21 लक्ष्य के साथ बनाया है, लेकिन चलाने की कोशिश कर रहे हैं यह एक पुराने एंड्रॉइड संस्करण वाले डिवाइस पर है। जब तक आप बहुत विशेष देखभाल नहीं करते हैं, तो आप पुराने उपकरणों पर android-21 लक्ष्य के साथ निर्मित बाइनरी नहीं चला सकते हैं। बुनियादी सी कार्यों के लिए, इससे कोई फर्क नहीं पड़ता कि android-3 और android-20 के बीच कौन सा लक्ष्य संस्करण उपयोग करता है, यह उन सभी पर काम करना चाहिए, लेकिन यदि आप android-21 का उपयोग करते हैं तो यह केवल उस संस्करण और नए पर काम करता है।

इस समस्या पर अधिक जानकारी के लिए https://stackoverflow.com/a/27093163/3115956 देखें।

+0

"बुनियादी सी कार्यों के लिए इससे कोई फर्क नहीं पड़ता ..." यह अधिकतर सच है, लेकिन बहुत सारे कार्यों को इनलाइन के रूप में परिभाषित किया जाता है और हमने उन्हें उचित प्रतीकों के लिए प्रचारित किया है। हाथ पर पूरी सूची नहीं है, लेकिन आईआईआरसी 'रैंड' उनमें से एक था। –

+0

हां, मेरी टिप्पणी का मतलब है कि एंड्रॉइड -21 में वास्तव में परिवर्तित किए गए सामान्य सी फ़ंक्शंस में एंड्रॉइड -3 और एंड्रॉइड -20 के बीच कोई बदलाव नहीं आया है। तो आप एंड्रॉइड -20 (या एंड्रॉइड -9) शीर्षलेखों का उपयोग करके आसानी से निर्माण कर सकते हैं उदा। यदि आप एक सशर्त रूप से उपयोग किए जाने वाले कोडेपैथ का उपयोग करना चाहते हैं जो ओपनएसएल ईएस का उपयोग करता है (डीएलएसआईएम का उपयोग करके गतिशील रूप से लोड किया गया है, या एक अलग .so में बनाया गया है) जबकि अभी भी एंड्रॉइड -3 पर चलने में सक्षम है। – mstorsjo

+0

पीजेएसआईपी के लिए एंड्रॉइड नमूना आवेदन एसडीके संस्करण 15 को लक्षित करता है और मैं एपीडी एमुलेटर पर एपीआई स्तर 15 के साथ लॉन्च करने की कोशिश कर रहा हूं। इसलिए यह मूल कारण नहीं है। –

11

mstorsjo मेरे प्रश्न का उत्तर दें। लेकिन मैं एक टिप्पणी लिखने हैं: मैं सही गुण फ़ाइलों की थी, लेकिन pjsip निर्माण के दौरान मैं निम्नलिखित लॉग नहीं मिला:

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

तो अगर आप कुछ विशेष मंच संस्करण पर परियोजना संकलन चाहते हैं, आप के लिए APP_PLATFORM पैरामीटर सेट करने के लिए है कॉन्फ़िगर-एंड्रॉइड स्क्रिप्ट।

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

मैं बस APP_PLATFORM = android-19 – JMR

+1

कूल जोड़ता हूं! किन्तु पर्याप्त नहीं। पुनर्निर्माण भी स्विंग बाइंडिंग। * Pjsip-apps/src/swig/* के लिए 'साफ करें और बनाएं' का उपयोग करें। – DenisKolodin

+0

build.gradle में APP_PLATFORM को कैसे जोड़ें? – Jitendra

3

मैं इस सामना करना पड़ा जब रचना और एंड्रॉयड के लिए pngquant JNI पुस्तकालय के साथ HUAWEI फोन का उपयोग कर। आखिरकार समाधान यह है कि मैं अपनी स्रोत फ़ाइल में रैंड, srand और फ़ंक्शन कार्यान्वयन को जोड़ता हूं। तब समस्या चली गई।

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; 
} 
संबंधित मुद्दे