2012-09-27 8 views
14

लोग,नहीं JNI_OnLoad लंघन init> अनुप्रयोग बंद

मैं एक Android आवेदन जहाँ मैं एक तीसरी पार्टी .so पुस्तकालय की जरूरत पर काम कर रहा हूँ मिल गया। मैंने को अपने निर्देशों के अनुसार इस तीसरे पक्ष की लाइब्रेरी (एनडीके-बिल्ड के साथ) बनाया और फिर इसे जोड़ने के लिए देख रहा था। इसलिए मेरे एंड्रॉइड प्रोजेक्ट में।

इसलिए मैंने दस्तावेज़/PREBUILTS.html में वर्णित चरणों का पालन किया और सफलतापूर्वक नया बनाया। इसलिए जेनी/प्रीबिल्ट निर्देशिका में। अब मैंने एक सरल परीक्षण एंड्रॉइड ऐप में इसका उपयोग करके .so सुविधाओं का लाभ उठाने का प्रयास किया। तो मुझे क्या करना है:

static { 
    Log.i("load so > ","load so"); 
    System.loadLibrary("xyz"); 
    } 
/* The native functions */ 
private static native int openFile(String filename); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try{ 
     String path = getPathForDownloadDirectoryFile(); 
     Log.i("file path> ", path); 
     int num= openFile(path); 
    }catch(Exception e){ 
     Log.e(">", "could not open the file"); 
    } 
} 

अब जब मैं अपने अनुप्रयोग चलाने मैं एक डिबग संदेश कह मिल: नहीं JNI_OnLoad /data/data/com.example.myfirstapp/lib/xyz.so 0x411e6738 में पाया, लंघन init और फिर एप्लिकेशन बंद हो जाता है।

अधिक जानकारी के लिए, यहाँ त्रुटि लॉग है:

No JNI_OnLoad found in /data/data/com.example.mysecondapp/lib/xyz.so 0x411e67a0, skipping init 
W/dalvikvm( 570): No implementation found for native Lcom/example/mysecondapp/MainActivity;.openFile:(Ljava/lang/String;)I 
D/AndroidRuntime( 570): Shutting down VM 
W/dalvikvm( 570): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
E/AndroidRuntime( 570): FATAL EXCEPTION: main 
E/AndroidRuntime( 570): java.lang.UnsatisfiedLinkError: Native method not found: com.example.mysecondapp.MainActivity.openFile:(Ljava/lang/String;)I 
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.openFile(Native Method) 
E/AndroidRuntime( 570): at com.example.mysecondapp.MainActivity.onCreate(MainActivity.java:31) 
E/AndroidRuntime( 570): at android.app.Activity.performCreate(Activity.java:5008) 
E/AndroidRuntime( 570): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
E/AndroidRuntime( 570): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
E/AndroidRuntime( 570): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
E/AndroidRuntime( 570): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
E/AndroidRuntime( 570): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
E/AndroidRuntime( 570): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 570): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime( 570): at android.app.ActivityThread.main(ActivityThread.java:4745) 
E/AndroidRuntime( 570): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 570): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
E/AndroidRuntime( 570): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
E/AndroidRuntime( 570): at dalvik.system.NativeStart.main(Native Method) 
W/ActivityManager( 146): Force finishing activity com.example.mysecondapp/.MainActivity 

मैं OpenFile के लिए है कि देशी कार्यान्वयन() विधि नहीं मिला था, लेकिन एक ही xyz.so lib मूल के साथ बहुत साफ काम देख सकते हैं के रूप में तीसरे पक्ष से नमूना ऐप। मैं एंड्रॉइड-एनएनडी दुनिया के साथ बहुत स्टार्टर हूं।

जावा-एंड्रॉइड-एनडीके निनजास .. मुझे लगता है कि मुझे क्या याद आ रहा है? मैं यहां किसी भी मदद की अत्यधिक सराहना करता हूं :)

उत्तर

16

जैसा कि लड़के ने कहा "कोई जेएनआई_ऑनलोड" सिर्फ एक चेतावनी नहीं है, आपकी समस्या कहीं और है।

आप उल्लेख किया है आपने सफलतापूर्वक अपना "इसलिए" फाइल संकलित, तो समस्या आपके C/C++ कोड के अंदर अपने समारोह हस्ताक्षर में झूठ सकता है यह इस

JNIEXPORT jint JNICALL Java_com_your_package_class_method(JNIEnv *d, jobject e, jstring f) 
{ 
//some action 

} 

समारोह हस्ताक्षर से आता है की तरह कुछ किया जाना चाहिए हेडर फ़ाइल जो जावा उपकरण का उपयोग करके जेनरेट की जाती है। आपको हेडर फ़ाइल जेनरेट करने और अपने पैकेज नाम के साथ फ़ंक्शन हस्ताक्षर का उपयोग करने की आवश्यकता है। विभिन्न पैकेज और वर्ग नामों के लिए हेडर फ़ाइल और संबंधित फ़ंक्शन हस्ताक्षर बदल जाएंगे।

worked pretty neat with the original sample app from the third party 

यह आपके ऐप पर नमूना ऐप पर चलने का कारण हो सकता है।

देखें: https://thenewcircle.com/s/post/49/using_ndk_to_call_c_code_from_android_apps

+0

सही! पैकेज का नाम कारण हो सकता है! मुझे उचित पैकेजिंग के साथ इसे आज़माएं। फिर आप पर वापस आ जाएगा, धन्यवाद! –

+0

मैं नई पैकेज संरचना के साथ बना हूं। इसलिए मेरा खुद का है लेकिन अब मुझे डिवाइस पर एपीके इंस्टॉल करते समय विफलता [INSTALL_FAILED_MISSING_SHARED_LIBRARY] त्रुटि मिल रही है, इस तथ्य के बावजूद कि xyz.so Project_folder/libs/arm_folder के अंतर्गत मौजूद है। कोई विचार क्या इसके पीछे हो सकता है? –

+0

अपनी मेक फ़ाइल पेस्ट करें और लिंक में दिए गए उदाहरण को चलाने का प्रयास करें, आपको कुछ स्पष्टता मिलेगी। –

6

"नो जेएनआई_ऑनलोड" संदेश सिर्फ एक चेतावनी है। जेएनआई_ऑनलोड एक वैकल्पिक प्रारंभिक हुक है।

मुझे लगता है कि आपकी समस्या openFile() विधि के अंदर है। जावा से कॉल को टिप्पणी करने का प्रयास करें और देखें कि आप कितनी दूर हैं।

मेरे पास जेएनआई के बारे में एक ब्लॉग पोस्ट है और http://guycole.blogspot.com/2012/03/yet-another-android-ndk-blog-posting.html पर कुछ नमूना कोड है - शायद आपको यह उपयोगी लगेगा।

शुभकामनाएं।

+0

धन्यवाद guycole! आप वास्तव में लेख बहुत व्यापक है। –

+0

बिल्कुल। आपका ब्लॉग पोस्ट अच्छी तरह से किया गया है, साथ ही साथ। जावा में जेएनआई कॉलबैक के लिए स्रोत कोड प्रदान करने वाला अच्छा स्पर्श। –

2

यह भी इस लॉग के साथ आता है

??-?? ??:??:??.???: INFO/(): java.lang.UnsatisfiedLinkError: Couldn't load *: findLibrary returned null

सही ??

मुझे लगता है कि यह एंड्रॉइड.एमके फाइलों की समस्या है। 1: armabi v7 को स्विथ करने का प्रयास करें। 2: लोड funciton खुले() को कॉल करेगा। इस तरह की अनुमति की जांच करें।

0

जैसा कि पिछले उत्तरों में बताया गया है, कोई जेएनआई_ऑनलोड केवल एक चेतावनी नहीं है।

मुझे इसी तरह की समस्या मिली, मुझे लगा कि समस्या फाइल संचालन के कारण है।

मेरा ऐप में नीचे दिए गए कोड को जोड़ने नहीं होने दिया गया था बाह्य भंडारण लिखने permission.After प्रकट यह काम कर रहा था ठीक

संबंधित मुद्दे