处理Java字符串为Android Studio+NDK的本地C/C++代码

3

我想在Android Studio1.3.2 + NDK + Windows7上构建一个程序。 我想要将一个字符串从Java函数传递到Native C函数(const char*)。

Native C函数的声明为:-

public native int HRFromJNI(String path);

Java函数调用为:

tv.setText(String.valueOf(HRFromJNI(path)));

本地C函数如下:

extern "C" {
  JNIEXPORT jint JNICALL
  Java_com_example_hellojni_HelloJni_HRFromJNI
  (JNIEnv *env, jobject obj,jstring path)
  {
    int HRval = 0;
    char *Path;

    Path = (*env)->GetStringUTFChars( env, path, null) ;

    HRval = filefunction(Path);
    return HRval;
  }

被本地C函数调用的函数是:
int filefunction(char* filename)
{
FILE* file = fopen((char*)filename,"w+");
//Reads value from the file and returns it.
.
.
.
}

但是我收到错误信息“Base operand of -> has non-pointer type JNIEnv{aka _JNIEnv}”。

这是将字符串传递给本地C代码的正确方式吗?还是有其他方法可以将Java中的字符串分配给const char *?


3
你使用了C语法((*env)->),但是错误提示是C++语法的错误(在C++中需要写成env->)。请注意修改代码。 - Violet Giraffe
1
顺便提一下,我认为你忘记调用 ReleaseUTFChars 了。 - Violet Giraffe
1
调用ReleaseUTFChars有什么用途? - Sandrocottus
2
释放GetStringUTFChars分配以保存字符串数据的内存。如果您不调用ReleaseUTFChars,则会出现内存泄漏。 - Violet Giraffe
1个回答

3

更改以下行:

Path = (*env)->GetStringUTFChars( env, path, null) ;

To:
致:
Path = env->GetStringUTFChars( env, path, JNI_TRUE) ;

传递jni布尔变量,而不是传递null。


1
extern "C",虽然我不明白。 - Violet Giraffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接