2012-07-06 14 views
12

निम्न कोड में लिंक करने एसटीएल स्ट्रिंग मुद्रण के बाद एक विभाजन गलती का कारण बनता है:एक स्टैंडअलोन एंड्रॉयड NDK निष्पादन

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "ndktest" << endl; 
    return 0; 
} 
  • अगर मैं printf करने के लिए अदालत बदलने के लिए, यह दुर्घटना नहीं करता है।
  • अगर मैं एक अलग मुख्य अलावा अन्य समारोह में अदालत कहते हैं, और समारोह पहुँचा कभी नहीं किया जाता है कि, यह अभी भी दुर्घटनाओं।
  • यह फियोयो पर क्रैश होता है, लेकिन आईसीएस नहीं।

    LOCAL_PATH:= $(call my-dir) 
    
    include $(CLEAR_VARS) 
    
    LOCAL_MODULE := ndktest 
    LOCAL_SRC_FILES := main.cpp 
    
    include $(BUILD_EXECUTABLE) 
    

    और Application.mk:

संदर्भ के लिए, मेरी Android.mk है

I/DEBUG ( 872): pid: 4234, tid: 4234 >>> /data/ndktest <<< 
I/DEBUG ( 872): signal 11 (SIGSEGV), fault addr 00024004 
I/DEBUG ( 872): r0 00033824 r1 00001000 r2 00024005 r3 bea42cfc 
I/DEBUG ( 872): r4 40008090 r5 0000000a r6 40008000 r7 afd42328 
I/DEBUG ( 872): r8 00000000 r9 00000000 10 00000000 fp 00000000 
I/DEBUG ( 872): ip 40008084 sp bea42ce8 lr afd192dd pc 00024004 cpsr 60000030 
I/DEBUG ( 872): d0 0000000000000000 d1 0000000000000000 
I/DEBUG ( 872): d2 0000000000000000 d3 0000000000000000 
I/DEBUG ( 872): d4 0000000000000000 d5 0000000000000000 
I/DEBUG ( 872): d6 0000000000000000 d7 0000000000000000 
I/DEBUG ( 872): d8 0000000000000000 d9 0000000000000000 
I/DEBUG ( 872): d10 0000000000000000 d11 0000000000000000 
I/DEBUG ( 872): d12 0000000000000000 d13 0000000000000000 
I/DEBUG ( 872): d14 0000000000000000 d15 0000000000000000 
I/DEBUG ( 872): scr 00000000 
I/DEBUG ( 872): 
I/DEBUG ( 872):   #00 pc 00024004 
I/DEBUG ( 872):   #01 pc 000192da /system/lib/libc.so 
I/DEBUG ( 872):   #02 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #03 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #04 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #05 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #06 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #07 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #08 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #09 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #10 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #11 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #12 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #13 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #14 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #15 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #16 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #17 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #18 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #19 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #20 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #21 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #22 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #23 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #24 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #25 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #26 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #27 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #28 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #29 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #30 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #31 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872): 
I/DEBUG ( 872): code around pc: 
I/DEBUG ( 872): 00023fe4 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00023ff4 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00024004 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00024014 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00024024 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 
I/DEBUG ( 872): code around lr: 
I/DEBUG ( 872): afd192bc f8cde018 f7f4e00c b930ec56 0c0cf844 
I/DEBUG ( 872): afd192cc 46302201 f7f49900 9803ec4e 47909a05 
I/DEBUG ( 872): afd192dc f1153c0c d5d735ff 2e006836 463cd1ce 
I/DEBUG ( 872): afd192ec b9b99901 c03cf8df 300cf857 f8471e58 
I/DEBUG ( 872): afd192fc b978000c 587a490c e0046810 68059900 
I/DEBUG ( 872): 
I/DEBUG ( 872): stack: 
I/DEBUG ( 872):  bea42ca8 b000c9b8 
I/DEBUG ( 872):  bea42cac 00000014 
I/DEBUG ( 872):  bea42cb0 b00093e0 /system/bin/linker 
I/DEBUG ( 872):  bea42cb4 b001e9b8 
I/DEBUG ( 872):  bea42cb8 b000c9b8 
I/DEBUG ( 872):  bea42cbc b0001c78 /system/bin/linker 
I/DEBUG ( 872):  bea42cc0 b001e724 
I/DEBUG ( 872):  bea42cc4 00000005 
I/DEBUG ( 872):  bea42cc8 b000c9b8 
I/DEBUG ( 872):  bea42ccc b0001de3 /system/bin/linker 
I/DEBUG ( 872):  bea42cd0 b000c9b8 
I/DEBUG ( 872):  bea42cd4 b0002c77 /system/bin/linker 
I/DEBUG ( 872):  bea42cd8 00000000 
I/DEBUG ( 872):  bea42cdc b001ffe8 
I/DEBUG ( 872):  bea42ce0 df002777 
I/DEBUG ( 872):  bea42ce4 e3a070ad 
I/DEBUG ( 872): #01 bea42ce8 00001000 
I/DEBUG ( 872):  bea42cec 00000000 
I/DEBUG ( 872):  bea42cf0 bea42cfc 
I/DEBUG ( 872):  bea42cf4 00033824 
I/DEBUG ( 872):  bea42cf8 00000000 
I/DEBUG ( 872):  bea42cfc 00024005 
I/DEBUG ( 872):  bea42d00 00033824 
I/DEBUG ( 872):  bea42d04 00000000 
I/DEBUG ( 872):  bea42d08 00000000 
I/DEBUG ( 872):  bea42d0c 00000000 
I/DEBUG ( 872):  bea42d10 b000c9b8 
I/DEBUG ( 872):  bea42d14 00000000 
I/DEBUG ( 872):  bea42d18 00000000 
I/DEBUG ( 872):  bea42d1c afd19731 /system/lib/libc.so 
I/BootReceiver( 946): Copying /data/tombstones/tombstone_09 to DropBox (SYSTEM_TOMBSTONE) 

के माध्यम से इस चल रहा है:

APP_STL := stlport_static 

यहाँ logcat से दुर्घटना है स्टैक ट्रेस टूल ने कोई प्रतीकात्मक जानकारी नहीं दी है।

अद्यतन:

क्रैश डम्प (/system/lib/libc.so में 0001972c) में पीसी मूल्य एक निकास दिनचर्या, जो दुर्घटनाग्रस्त होने के बाद स्ट्रिंग छपा है के साथ संगत है में है:

00019728 <exit>: 
    19728: 4604  mov r4, r0 
    1972a: 2000  movs r0, #0 
    1972c: f7ff fd8c bl 19248 <__cxa_finalize> 
    19730: 4620  mov r0, r4 
    19732: f7f3 ee96 blx d460 <_exit> 
    19736: bf00  nop 
+0

आप अपने Android.mk में 'LOCAL_LDLIBS + = -ldl' और' LOCAL_SHARED_LIBRARIES + = libdl' जोड़ने में देखा नहीं किया है? विशेष रूप से 'डीएल' कहने का कारण, स्लॉपोर्ट के लिए साझा लाइब्रेरी में लिंक करने के लिए गतिशील लिंकिंग हिस्सा है। – t0mm13b

+0

@ t0mm13b: मैंने कोशिश की, लेकिन जब भी मैं प्रोग्राम चलाता हूं तब भी "निष्पादन योग्य नहीं हो सकता"। मैं मुख्य() में libstlport_shared.so कैसे लोड करूं? – Ravi

+0

http://stackoverflow.com/questions/7339229/android-std-and-stl-support, http://sseyod.blogspot.ie/2009/08/android-jni-ndk-and-stl-support.html , http://stackoverflow.com/questions/1650963/ustl-or-stlport-for-android <- पिछले पंक्ति का जवाब हो सकता है ... यह बाहर की जाँच :) – t0mm13b

उत्तर

5

इस तथ्य यह है कि आप stlport_static बजाय stlport_shared का उपयोग करने के कारण शायद है।

NDK डॉक्स (cplusplus-support.html पैकेज में शामिल) में, यह व्यवहार में वर्णित है। यह अप्रत्याशित व्यवहार इस तथ्य से निकला है कि यदि आवेदन दो (या अधिक) साझा पुस्तकालयों के खिलाफ लिंक करता है, और stlport_static के खिलाफ दोनों लिंक, कुछ प्रतीकों को डुप्लिकेट किया जा सकता है, जिससे गलत व्यवहार होता है।

+0

मेरे पास मेरे प्रोजेक्ट में कोई साझा लाइब्रेरी नहीं है। उपरोक्त मेरे मेकफ़ाइल में, मैं सिर्फ एक निष्पादन योग्य निर्माण कर रहा हूं जो स्थिर रूप से एसटीएल को लिंक करता है। क्या कोई कारण है कि मुझे एसटीएल के साझा संस्करण में स्विच करने की आवश्यकता होगी? – Ravi

+0

@Ravi: इसे आज़माएं और देखें कि यह काम करता है ... – Goz

+0

मैं एनडीके परत पर साझा लाइब्रेरी के रूप में एसटीएल का उपयोग करने के तरीके पर स्पष्ट नहीं हूं। अगर मैं stlport_shared का उपयोग करता हूं, तो दस्तावेज एक स्थिर जावा प्रारंभकर्ता में लाइब्रेरी लोड करने के लिए कहता है। क्या इसका मतलब है कि मुझे इसे एपीके के रूप में बनाने की ज़रूरत है? मैं इस परियोजना को शुद्ध एनडीके निष्पादन योग्य के रूप में संरक्षित करने की कोशिश कर रहा हूं क्योंकि इसमें कमांड लाइन इंटरफ़ेस है, और मैं इसे/system/xbin का हिस्सा बनाना चाहता हूं। – Ravi

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