【问题标题】:How to write byte array data in to .jpg file in android using JNI如何使用 JNI 将字节数组数据写入 android 中的 .jpg 文件
【发布时间】: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


【解决方案1】:

忘记 JNI 并用 Java 来做:

OutputStream out = new FileOutputStream(filePath);
out.write(bmpArray);
out.close();

如果它的运行速度比您发布的内容的更正版本更快,我会感到惊讶。

【讨论】:

  • 问题是:“如何使用 JNI 将字节数组数据写入 android 中的 .jpg 文件”。请随身携带您的建议...
  • 当然。不要忘记让我们知道您证明所有额外成本和复杂性的方法有多快。
  • Omg..如果我有所有辛勤工作的 C 代码(转换、修改等),将结果写入此 C 文件中的文件会更快。
  • @user2556562 在我发布此答案的几个小时前,您的问题中都没有提到这些,或者当我问您为什么要使用 JNI 时。此答案中的代码与您发布的代码完全等效,只是它可以工作。我回答了你问的问题。 3.5 年后仍在等待通过 JNI 了解它的速度有多快。
猜你喜欢
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2014-04-10
  • 2016-07-05
  • 2019-02-07
相关资源
最近更新 更多