2013-03-07 10 views
9

का उपयोग कर एसडी कार्ड से फ़ाइल IO एनडीके का उपयोग करके आउटपुट फ़ाइल पर लिखने की कोशिश कर रहा हूं, और ऐसा लगता है कि यह काम नहीं कर रहा है। कोड मैंने लिखा इस तरह दिखता है:एंड्रॉइड: एनडीके

JNIEXPORT jdouble JNICALL Java_com_example_sdcardtest2_CppMethods_nativeCalculations (JNIEnv* env, jclass clazz, jdouble dub){ 
    jdouble hub = dub + 10; 
    FILE* file = fopen("/sdcard/textTest.txt","w+"); 
    fputs("HELLO WORLD!\n", file); 
    fclose(file); 
return hub; 
} 

कारण है कि वापसी प्रकार एक डबल है, कि मैं एक और उद्देश्य के लिए समारोह का उपयोग करने पर योजना बना रहा हूँ, लेकिन मैं पहले कब फ़ाइल बाहर कोशिश कर रहा हूँ। logcat में, मैं निम्नलिखित त्रुटि हो रही है:

Fatal signal 11: (SIGSEGV) at 0x00000000c (code = 1) ..... 

अजीब बात है, जब मैं करने के लिए लिख सकते हैं या जावा फ़ाइल कब, मैं कोई समस्या नहीं कर रहा हूँ का उपयोग कर फोन करने वाले गतिविधि में एक ही फ़ाइल से पढ़ने के लिए प्रयास करें। और मैंने सुनिश्चित किया कि मेरे पास मैनिफेस्ट फ़ाइल में लेखन अनुमतियां हैं। साथ ही, अगर मैं FILE* file ... लाइन को हटा देता हूं, और फ़ंक्शन से लौटाए गए डबल मान का उपयोग करने का प्रयास करता हूं, तो प्रोग्राम ठीक चलता है। क्या कोई मदद कर सकता है? क्या समस्या कुछ ऐसा हो सकता है जो मुझे Android.mk या Application.mk फ़ाइलों में शामिल करना चाहिए, उदाहरण के लिए?

अद्यतन मैं एक Samsung Galaxy Note 2 का उपयोग कर रहा है, तो यह है कि कोई फर्क

UPDATE2 बनाता

यहाँ पूर्ण कोड है:

जावा गतिविधि:

public class MainActivity extends Activity { 
private TextView text1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    this.text1 = (TextView) findViewById(R.id.textView1); 
    double d = CppMethods.nativeCalculations(2.80); 
    String s = "The value of d is = " + d; 

    File f1 = new File("/sdcard/textTest.txt"); 
    InputStream is = null; 
    try { 
     is = new FileInputStream(f1); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    Scanner reader = new Scanner(is); 


    this.text1.setText(reader.nextLine().subSequence(0, s.length())); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

} 

यहां मूल विधि है:

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include "com_example_sdcardtest2_CppMethods.h" 
#include <stdio.h> 
#include <string.h> 


/* 
* Class:  com_example_sdcardtest2_CppMethods 
* Method: nativeCalculations 
* Signature: (D)D 
*/ 

JNIEXPORT jdouble JNICALL Java_com_example_sdcardtest2_CppMethods_nativeCalculations 
    (JNIEnv* env, jclass clazz, jdouble dub){ 
    jdouble hub = dub + 10; 
    FILE* file = fopen("/sdcard/textTest.txt","w+"); 
    fputs("hello, world\n", file); 
    fclose(file); 




    return hub; 
} 

यहाँ Android.mk है:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_SRC_FILES := com_example_sdcardtest2_CppMethods.c 
LOCAL_MODULE := com_example_sdcardtest2_CppMethods 
include $(BUILD_SHARED_LIBRARY) 

और यहाँ प्रकट है:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.sdcardtest2" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.sdcardtest2.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

अद्यतन

अंतिम अद्यतन: मैं किसी और के फोन पर एक ही कोड की कोशिश की , एक आकाशगंगा नोट 2 भी, और यह काम किया। ऐसा लगता है कि समस्या मेरे फोन के साथ थी। विलाप

+0

फ़ाइल अशक्त फिर ... – auselen

+0

फ़ाइल वास्तव में अशक्त है, लेकिन कैसे है कि कोई मतलब है? अगर फ़ाइल निर्देशिका में नहीं है, तो फॉपेन इसे बनाएगा और फिर उस पर लिख देगा। इसके अलावा, के रूप में मैं प्रश्न में कहा, Main.java गतिविधि फ़ाइल में एक ही सटीक पथ का उपयोग कर मुझे किसी भी त्रुटि नहीं देता है (का उपयोग करते हुए 'f1 = नई फ़ाइल ("/sdcard/textTest.txt ") फ़ाइल' – user1023420

+0

आप क्या है 'android.permission.WRITE_EXTERNAL_STORAGE' अनुमति – auselen

उत्तर

0

हो सकता है कि पथ फ़ाइल गलत है। मैंने एसडीकार्ड पथ का उपयोग "/ mnt/sdcard /" के रूप में किया था।

मैं बिल्कुल याद नहीं कर सकते, लेकिन आप कोशिश कर सकते हैं "/ mnt/sdcard/..." या "mnt/sdcard/..."।

या, आप Environment.getExternalStorageDirectory().getAbsolutePath() का उपयोग कर SDCard पथ प्राप्त कर सकते हैं।

+0

कृपया ऊपर अपडेट देखें, ऐसा लगता है कि यह मेरे फोन के साथ एक गड़बड़ था:/ – user1023420

+0

"या पर्यावरण का उपयोग कर sdcard पथ प्राप्त करें .getExternalStorageDirectory()। getAbsolutePath()" नहीं, और यहां क्यों है: (बहुत खराब उन्होंने इसे बंद कर दिया) - user1023420 - यह आपका फोन नहीं हो सकता है ... यदि आपके पास "/ storage/sdcard0 "सैमसंग का दावा है कि हमें"/बाहरी_एसडी/"फिर फ़ाइल नाम जोड़ना है - लेकिन हमने सत्यापित किया है कि यह विभिन्न एस 3 फोन पर अलग-अलग काम करता है - कुछ पर विफल रहता है, दूसरों पर असंगत रूप से काम करता है –

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