我正在学习在本书中使用JNI。我正在使用它与 C++ 进行 Java 通信。如果您查看本书的第 25 页,您会看到一段“转换为”C++ 的 C 代码应如下所示:
#include <jni.h>
#include <iostream>
#include "Prompt.h"
using namespace std;
JNIEXPORT jstring JNICALL
Java_Prompt_getLine (JNIEnv *env, jobject obj, jstring prompt){
char buf[128];
const jbyte *str;
str = env->GetStringUTFChars(prompt, NULL);
if(str == NULL){
return NULL; /* OutOfMemoryError already thrown */
}
printf("%s", str);
env->ReleaseStringUTFChars(prompt, str);
/* We assume here that the user does not type more than
* 127 characters */
scanf("%s",buf);
return env->NewStringUTF(buf);
}
在我看来,str的声明应该是这样的:
const char* str;
我只是想了解这本书是错的还是有一些解释。因为他们以后会做类似的事情。如果我将 str 声明为 char 指针,我的代码就可以工作,但我想了解我是否做错了什么。
非常感谢,如果我发布了错误的内容,我们深表歉意。这是我在这个社区的第一条消息。
编辑:如果我用 jbyte* 编译,编译器会给出以下错误:
openjdk-amd64/include" -I"/usr/lib/jvm/java-7-openjdk-amd64/include/linux" -shared -o libPrompt.so Prompt.cpp -fPIC
Prompt.cpp: In function '_jstring* Java_Prompt_getLine(JNIEnv*, jobject, jstring)':
Prompt.cpp:12:43: error: invalid conversion from 'const char*' to 'const jbyte* {aka const signed char*}' [-fpermissive]
Prompt.cpp:17:40: error: invalid conversion from 'const jbyte* {aka const signed char*}' to 'const char*' [-fpermissive]
In file included from Prompt.cpp:1:0:
/usr/lib/jvm/java-7-openjdk-amd64/include/jni.h:1619:10: error: initializing argument 2 of 'void JNIEnv_::ReleaseStringUTFChars(jstring, const char*)' [-fpermissive]