【问题标题】:Passing a string to C-code in Android NDK在 Android NDK 中将字符串传递给 C 代码
【发布时间】:2012-07-18 12:33:13
【问题描述】:

程序应从 SD 卡中获取图像并调整其亮度。并且图像是通过 NDK C 代码从 SD 卡中获取的。需要注意的是,描述图像路径的字符串通过 JNI 传递给 NDK。

Java 代码:

private void adjustBrightness() {
   imagePath     = (Environment.getExternalStorageDirectory().getPath()+"earthglobe.jpeg").toCharArray();
   brightness(imagePath, brightness);
}

public native void brightness(char[] imagePath, float brightness);

NDK 代码:

JNIEXPORT void JNICALL Java_com_example_ImageActivity_brightness(JNIEnv * env,char[] bitmappath, jfloat brightnessValue)
{
   string bmpath    =   bitmappath+'\0';
   jobject  obj = fopen( bitmappath , "rb" );
}

【问题讨论】:

  • 这太可笑了:jobject obj = fopen( bitmappath , "rb" );

标签: android c string java-native-interface android-ndk


【解决方案1】:

你不能以这种方式传递 char[]。

在 Java 中使用:

public static native void brightness(String imagePath, float brightness);

原生使用:

std::string ConvertJString(JNIEnv* env, jstring str)
{
   if ( !str ) std::string();

   const jsize len = env->GetStringUTFLength(str);
   const char* strChars = env->GetStringUTFChars(str, (jboolean *)0);

   std::string Result(strChars, len);

   env->ReleaseStringUTFChars(str, strChars);

   return Result;
}

JNIEXPORT void JNICALL Java_com_example_ImageActivity_brightness(JNIEnv * env, jobject obj, jstring bitmappath, jfloat brightnessValue)
{
   std::string bmpath = ConvertJString( env, bitmappath );
   FILE* f = fopen( bmpath.c_str(), "rb" );

   // do something useful here

   fclose( f );
}

【讨论】:

  • 谢谢,我希望位图作为 Jobject 而不是文件,因为已经有一个函数可以从 Jobject 中检索像素...有什么办法可以做到这一点吗?
  • 使用 java.nio.ByteBuffer 传递像素。
  • 我想你误会了....要么我想将 bmp 作为 JObject 检索(在 NDK 中),要么我需要一种方法从 NDK 中的文件中获取像素。跨度>
  • 我并不害羞,这和我的问题一样,但这个解决方案对我不起作用..
  • @wEight std::string
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多