使用JNI接收GetStringUTFChars

时间:2013-10-17 18:32:58

标签: java c++ java-native-interface

我正在学习将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]

2 个答案:

答案 0 :(得分:0)

jbytesigned 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);