2017-01-16 9 views
5

का उपयोग करके लोड कर रहा हूं। मैं एंड्रॉइड स्टूडियो (2.2.3) का नवीनतम संस्करण उपयोग कर रहा हूं और मैंने हैलोजीएल 2 नमूना प्रोजेक्ट को लोड किया है।मैं एंड्रॉइड प्रोजेक्ट में एक फ़ाइल कैसे जोड़ूं और फिर इसे एनडीके

अब मैं अपने ऐप में एक फ़ाइल (किसी भी प्रकार की फ़ाइल) जोड़ना चाहता हूं, और उसके बाद इसे खोलने में सक्षम हूं और इसे सी ++ कोड में सी के फॉपेन इत्यादि का उपयोग करके पढ़ सकता हूं (किसी भी प्रत्यक्ष फ़ाइल एक्सेस एपीआई ठीक है)

मैं यह कैसे कर सकता हूं?

+0

['संपत्ति]] (https://developer.android.com/ndk/reference/group___asset.html) का उपयोग करें या जेएनआई कॉल के माध्यम से फ़ाइल के लिए एक पूर्ण पथ पास करें। – Onik

उत्तर

7

दो विकल्प हैं, यह आपके लक्ष्य पर निर्भर करेगा। यदि आपकी फ़ाइल एक मूल पाठ कॉन्फ़िगरेशन फ़ाइल है, तो आप दोनों मामलों का उपयोग कर सकते हैं, लेकिन यदि आपकी फ़ाइल एक 3 डी ऑब्जेक्ट है जैसे कि (.obj, .max, .dae) तो आपको AssetManager क्लास का उपयोग करना चाहिए।

पहला विकल्प: (अपनी फ़ाइलों को कच्चे कच्चे में स्टोर करें (आप fopen() का उपयोग कर सकते हैं)।

  • नामक फ़ोल्डर कच्चे अंदर रेस निर्देशिका (res-> कच्चे) बनाएँ।
  • अपनी फ़ाइलों को एपीके निजी निर्देशिका में लिखें।

जावा में:

public void writeFileToPrivateStorage(int fromFile, String toFile) 
    { 

     InputStream is = mContext.getResources().openRawResource(fromFile); 
     int bytes_read; 
     byte[] buffer = new byte[4096]; 
     try 
     { 
      FileOutputStream fos = mContext.openFileOutput(toFile, Context.MODE_PRIVATE); 

      while ((bytes_read = is.read(buffer)) != -1)    
       fos.write(buffer, 0, bytes_read); // write 

      fos.close(); 
      is.close(); 

     } 
     catch (FileNotFoundException e) 
     {    
      e.printStackTrace(); 
     } 
     catch (IOException e) 
     {    
      e.printStackTrace(); 
     }     
    } 

फिर, अपने कार्य करने के लिए कहते हैं: अपने निजी पथ

 writeFileToPrivateStorage(R.raw.your_file,"your_output_file.txt"); 
  • जाओ
 
    path=mContext.getApplicationContext().getFilesDir().toString(); 
  • जावा में अपने JNI funcion परिभाषित करें:
 
    public static native void setconfiguration(String yourpath); 
  • C/C++ में इसे लागू:
 
    JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_setconfiguration(JNIEnv * env, jobject obj, jstring path) 
     { 
      //convert your string into std::string. 
      const char *nativeString = env->GetStringUTFChars(config_path, 0); 
      //make here your fopen. 
      fopen(nativeString,"r"); 
     } 

दूसरा विकल्प (ओपन संसाधनों के लिए assetManager उपयोग करते हैं, आमतौर पर)।

पैरामीटर, इस मामले में, निर्देशिका का पथ संपत्ति प्रबंधक नहीं है।

  • अपनी फ़ाइलों को संपत्ति निर्देशिका में स्टोर करें।
  • इस समारोह के लिए/C++
 
    public static native void yourfunction(AssetManager assetManager); 
  • जावा में कॉल सी में अपनी मूल समारोह को परिभाषित करें:
 
    loadYourFile(m_context.getAssets()); 
  • C/C++
  • में अपने JNI समारोह बनाएं
 
    JNIEXPORT void Java_com_android_gl2jni_GL2JNILib_(JNIEnv * env, jobject obj,jobject java_asset_manager) 
     { 
     AAssetManager* mgr = AAssetManager_fromJava(env,java_asset_manager); 
      AAsset* asset = AAssetManager_open(mgr, (const char *) js, AASSET_MODE_UNKNOWN); 
      if (NULL == asset) { 
       __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, "_ASSET_NOT_FOUND_"); 
       return JNI_FALSE; 
      } 
      long size = AAsset_getLength(asset); 
      char* buffer = (char*) malloc (sizeof(char)*size); 
      AAsset_read (asset,buffer,size); 
      __android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, buffer); 
      AAsset_close(asset); 
     } 

नोट: अपने AndroidManifest.xml में अनुमतियां जोड़ने के लिए मत भूलना।

नोट द्वितीय: जोड़ने के लिए मत भूलना:

#include <android/asset_manager.h> 
#include <android/asset_manager_jni.h> 

मुझे आशा है कि इस सवाल का जवाब आप मदद करता है।

+0

धन्यवाद एक गुच्छा! इस पर एक स्पष्ट उदाहरण खोजने के लिए इतना मुश्किल था। बस सोच रहा है, क्या यह एमजीआर पॉइंटर रखने और बाद में इसका उपयोग करने के लिए खराब फॉर्म है? तो बस एसेट मैनेजर को मूल कोड में एक बार पास करें और उसके बाद मूल कोड में ऐप के जीवनकाल के दौरान संपत्ति लोड करने के लिए उस पॉइंटर का उपयोग करें? – matt

+1

आप सही @ matt हैं, mgr पॉइंटर को रखना बुरा नहीं है, मैं आमतौर पर सेट ओपनग संसाधन लोडर वर्गों में रखने के लिए setAssetManager() जैसे सेटरफंक्शन का उपयोग करता हूं। – uelordi

+1

एक और बात, यदि आपका अंतिम लक्ष्य 3 डी ऑब्जेक्ट्स लोड करना है, तो assimp 3 डी लाइब्रेरी http://www.assimp.org/ का उपयोग करें। चीयर्स। – uelordi

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