Error:(289, 23)C++ / JNI / NDK - error: cannot initialize a parameter of type 'char *' with an lvalue of type 'jstring' (aka '_jstring *')

Error:(289, 23)C++ / JNI / NDK - error: cannot initialize a parameter of type 'char *' with an lvalue of type 'jstring' (aka '_jstring *')

我在使用 C++/Android (JNI) 时遇到错误,我完全不知道如何修复它..(我是 C++ 的新手)

Error:(289, 23) error: cannot initialize a parameter of type 'char *' with an lvalue of type 'jstring' (aka '_jstring *')

这一行的错误点

JNIEXPORT void Java_de_meetspot_ndktest_MainActivity_LoadPlayerA(JNIEnv *javaEnvironment, jobject self, jstring audioPath, jlongArray offsetAndLength) {
    example->LoadPlayerA(audioPath, offsetAndLength);
}

在我的 class-声明中我有:

public: void LoadPlayerA(char *audioPath, int *params);android

有人能告诉我,我哪里错了吗?

这个错误很容易解释。在 example->LoadPlayerA(audioPath, offsetAndLength); 中,audioPath 的类型是 jstring,但在您的 LoadPlayerA() 函数中,第一个参数是 char *audioPath。编译器不知道如何将 jstring 转换为 char*,因此您必须自己完成。

Jason Rogers answer here 借用,您可以将代码更改为:

JNIEXPORT void Java_de_meetspot_ndktest_MainActivity_LoadPlayerA(JNIEnv *javaEnvironment, jobject self, jstring audioPath, jlongArray offsetAndLength)
{
    const char* audio = javaEnvironment->GetStringUTFChars(audioPath, JNI_FALSE)
    example->LoadPlayerA(audio, offsetAndLength);
    javaEnvironment->ReleaseStringUTFChars(audioPath, audio);
}

编辑:

我忘了包含 Release() 函数。这需要在完成数组后调用,否则会发生内存泄漏。