我正在学习将JNI用于this本书。我用它来用Java与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]
答案 0 :(得分:0)
jbyte
与signed char
相同,您可以在jni.h中查看:
#ifdef HAVE_INITTYPES_H
# include <inttypes.h> /* C99 */
typedef int8_t jbyte;
...
#else
typedef signed char jbyte;
...
GetStringUTFChars
在jni.h中定义为3个参数,奇怪的是你也没有得到这行的错误!
最后一个参数是jboolean*
,表示是否已复制。
函数的返回类型在oracle网站上针对Java 6和7定义为const char*
,并且它也在Android NDK的jni.h文件中定义。 NDK添加了一条评论,指出:
JNI规范说这会返回
const jbyte*
,但这是不一致的
所以也许较旧的规范说const jbyte*
这就是为什么你的书使用这种类型,或者修改了规范并且你的书已经过时了。
此外,C允许从char*
转换为signed char*
(const或不是const),而不是C ++,这就是您收到错误的原因
答案 1 :(得分:0)
它认为书中有一个错误,如果你看JNI specification,它就被宣布为
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);