我是 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帮助
问候,
迪帕克