将字符串传递给Android NDK中的C代码

Sre*_*hat 9 c string java-native-interface android android-ndk

程序应从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);
Run Code Online (Sandbox Code Playgroud)

NDK代码:

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

Ser*_* K. 21

你不能这样传递char [].

在Java中使用:

public static native void brightness(String imagePath, float brightness);
Run Code Online (Sandbox Code Playgroud)

在本机使用:

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

   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 );
}
Run Code Online (Sandbox Code Playgroud)

  • 我并不害羞,这和我的问题一样,但这个解决方案对我不起作用.. (2认同)