0

我是 android 新手,我正在尝试使用 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() 。来自本机的调用是callFromCPP(byte[] buff),这里仅将字节写入从本机返回的 SD 卡(名为22MB.zip)。

PLZ帮助

问候,

迪帕克

4

1 回答 1

0

我发现我犯的错误,..“fread”函数读取字节有一个限制..我给了 1MB(我的 c 文件中的 nread 值)太大了..所以我将值更改为 100 和有效

问候,

迪帕克

于 2012-08-31T15:04:11.187 回答