【发布时间】:2014-01-12 16:19:20
【问题描述】:
我想通过在 android 中使用 JNI 将字节数组数据存储到 .jpg 文件中。 我使用以下代码,它将存储字节数组数据,但 .jpg 文件未打开,否则在手机图库中打开文件时会显示错误。
这里是 bmpArray :字节数组 filePath : sdcard目录+文件名
void Java_com_appsforbb_businesscardreader_ImageUtility_setNativeBitmapArray(JNIEnv* env, jclass object,jbyteArray bmpArray,jstring filePath)
{
jbyte* bmp= env->GetByteArrayElements(bmpArray, 0);
jsize length = env->GetArrayLength(bmpArray);
jbyteArray arr = env->NewByteArray(length);
const char* path = env->GetStringUTFChars(filePath, 0);
FILE* file = fopen( path, "w+" );
fwrite(bmpArray, 1, length, file );
fflush(file);
fclose(file);
LOGI("Byte array stored..");
}
是的,我得到了解决方案 将参数bmpArray替换成bmp
即
void Java_com_appsforbb_businesscardreader_ImageUtility_setNativeBitmapArray(JNIEnv* env, jclass object,jbyteArray bmpArray,jstring filePath)
{
jbyte* bmp= env->GetByteArrayElements(bmpArray, 0);
jsize length = env->GetArrayLength(bmpArray);
const char* path = env->GetStringUTFChars(filePath, 0);
FILE* file = fopen( path, "w+" );
fwrite(bmp, 1, length, file );
fflush(file);
fclose(file);
free(bmp);
free(file);
LOGI("---------->byte array stored..");
}
【问题讨论】:
-
为什么?您可以直接从 Java 中执行此操作。为什么你认为你需要 JNI?
-
@EJP 快一点,真的。
-
真的吗?你有任何证据证明这一说法吗?或者你只是在猜测?在您发布的代码中,您有一个要跨越的 JNI 边界和至少三个返回 Java 的回调。您知道这些操作的成本吗?
-
当你无法让它工作并且不得不在这里问一个关于如何做到这一点的问题时,你怎么可能测试它?
-
@challa 你可以将 bytearray 转换为位图而不是保存并返回位图吗?
标签: android file java-native-interface