Android NDK:使用NDK + SDK android打开写入SD卡的文件时出错

时间:2012-08-31 12:45:35

标签: android android-ndk-r5

我是android的新手,iam尝试使用NDK从SD卡读取文件并将读取的字节发送到SDK并使用SDK将其写入SD卡(用于检查)..我可以通过以下方式进行调用NDK - 具有字节的SDK,我可以使用SDK将其写入SD卡。但我可以打开写入SD卡的文件..

我正在粘贴我的代码

原生C档

#include<stdio.h>
#include<string.h>
#include <jni.h> 
#include <stdlib.h> 
#include <android/log.h>  
#include "com_example_fileupload_NativeLib.h"

#define  LOG_TAG    "testjni" 
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)  

JavaVM *m_vm; 
jobject obj; 
jclass gFilePermInfoClass;
jmethodID gFilePermInfoClsConstructor;

jint JNI_OnLoad(JavaVM* vm, void* reserved) 
{
     JNIEnv* env;     
    LOGI("JNI INIT");      
    return JNI_VERSION_1_6; 

} 

JNIEXPORT jint JNICALL Java_com_example_fileupload_NativeLib_loop
  (JNIEnv *env, jobject obj)
{

LOGI("JNI work !"); 
jbyteArray data; 
jbyteArray data_rem; 
jclass clazz = (*env)->FindClass(env,"com/example/fileupload/NativeLib"); 
if (clazz == 0) { 
LOGI("FindClass error"); 
return 2; 
} 
gFilePermInfoClass = (*env)->NewGlobalRef(env, clazz);
LOGI("JNI before jmethodID"); 
jmethodID javamethod = (*env)->GetMethodID(env,gFilePermInfoClass, "callFromCPP", "([B)V"); 
gFilePermInfoClsConstructor = (*env)->NewGlobalRef(env, javamethod);
if (javamethod == 0) { 
LOGI("GetMethodID error"); 
return 3; 
} 
LOGI("JNI before calling java ");

LOGI(" before File "); 
FILE *fd = NULL;
    char buff[1*1024*1024];
char *h;
    unsigned int nread = 0;
     unsigned int nread_remaining = 0;
int count=0;
    memset(buff, '\0', sizeof(buff));
    fd = fopen("/sdcard/20MB.zip","r+");
    fseek ( fd, 0 , SEEK_END ); 
    int fileSize = ftell(fd); 
    LOGI("****SUDARSHAN C SIZE %d",fileSize);

    if(NULL == fd) // Check for error
    {
       LOGI("\n File opening failed\n");
        return 1;
    }
    nread = (1*1024*1024); // Hard code the number of elements to 50

    if(nread_remaining = fileSize%nread)
    {
    count = fileSize/nread;
    LOGI("***** IN IF rem %d",nread_remaining);
    }
    else{
    count = fileSize/nread;
    LOGI("***** IN ELSE COUNT  %d",count);
    }

 data = (*env)->NewByteArray(env, nread); 
  data_rem = (*env)->NewByteArray(env, nread_remaining); 
  if(data == NULL){         
  LOGI("No memory could be allocated for buffer");         
  return -1;     
  } 

LOGI("Before While in C "); 
int count_test=0;
int i;
   for(i=count;i>0;i--) //while(count_test) //while( fread(buff, 1, nread, fd) )
    {
        fread(buff, 1, nread, fd);
        LOGI("INSIUDE WHILE SUDARSHAN **** %d",i);
        (*env)->SetByteArrayRegion(env, data, 0, nread, buff);     
        (*env)->CallVoidMethod(env, obj, gFilePermInfoClsConstructor, data); 
    }

    if(nread_remaining){
    char buffer[nread_remaining];
    fread(buffer, 1, nread_remaining, fd);
    (*env)->SetByteArrayRegion(env, data_rem, 0, nread_remaining, buffer);     
    (*env)->CallVoidMethod(env, obj, gFilePermInfoClsConstructor, data_rem); 
    }

    if(feof(fd))
    {
       printf("\n Seems like end of file was reached\n");
    }
    else if(ferror(fd))
    {
       printf("\n Some errors on this stream occurred\n");
    }

    // Reset the buffer with NULLs
    memset(buff, '\0', sizeof(buff));
    return (10+11);
}

NativeLib.java

package com.example.fileupload;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.os.Environment;



public class NativeLib {

    public int count=0;
    File someFile = null;
    FileOutputStream fos = null;
    File sdDir = new File(Environment.getExternalStorageDirectory().getPath());
    public NativeLib() throws FileNotFoundException{

        someFile = new File(sdDir.getPath() +"/22MB.zip");
        fos = new FileOutputStream(someFile);

        //fos.flush();fos.close();

    }
      static {
        System.loadLibrary("com_example_fileupload_NativeLib");
      }

      /** 
       * Adds two integers, returning their sum
       */
      public native int loop();

      /**
       * Returns Hello World string
     * @throws IOException 
       */
      //public native String hello();

      public void callFromCPP(byte[] buff)
        {  
          count=count+buff.length;
          try {
              //count=count+buff.length;
              System.out.println("************ Sudarshan Inside callfromcpp try "+count+"   "+buff.length);
            fos.write(buff);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("************ Sudarshan Inside callfromcpp catch "+e.toString());
            e.printStackTrace();
        }
         // count=count+buff.length;
          //System.out.println("************ Sudarshan Inside callfromcpp 1 "+buff.toString()+"   "+count); 

        } 

我打电话给原生fn。 MainActivity.java 和java fn中的 loop()。来自native的调用是 callFromCPP(byte [] buff),这里只有iam将字节写入SD卡(名为 22MB.zip )从本机返回..

PLZ帮助

Reagards,

迪帕克

1 个答案:

答案 0 :(得分:0)

我发现了我所犯的错误,...“fread”函数有一个限制来读取字节..我已经给了1MB(我的c fle中的nread值)太大了..所以我更改了值到100,它工作

此致

迪帕克