android - 在 Android NDK 中将字符串传递给 C 代码

标签 android c string java-native-interface 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);

NDK代码:

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

最佳答案

你不能通过这种方式传递 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 );
}

关于android - 在 Android NDK 中将字符串传递给 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11558899/

相关文章:

android - 无法使用仅指定操作的隐式 Intent 启动 Activity

Android评分栏设置星级维度

c - 将语义规则应用于 Bison

c++ - 共享内存或 mmap - Linux C/C++ IPC

JavaScript 不会对数字求和

凯撒密码

c - 带符号的十六进制字符串到 long int 函数

Android - Material 主题

android - 我无法在代码中获取 EMAIL_ID 列,而是在 emailid 列中获取联系号码

c - 我想在我的程序中创建一个死锁,但它不起作用(C、fork、并行编程)