0

我正在学习在本书中使用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]
4

2 回答 2

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*指示是否已制作副本。

该函数的返回类型const char*在 oracle 网站上定义为 Java 6 和 7,它也定义为 Android NDK 的 jni.h 文件中的定义。NDK 添加了一条注释,指出:

JNI 规范说这会返回const jbyte*,但这是不一致的

所以也许一个较旧的规范说const jbyte*这就是你的书使用这种类型的原因,或者规范被修改并且你的书已经过时了。

此外,C 允许从char*to转换signed char*(是否为 const),但 C++ 不允许转换,这就是您收到错误的原因

于 2013-10-17T19:00:13.113 回答
0

它认为书中有一个错误,如果你看一下JNI规范,它被声明为

const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
于 2013-10-17T19:17:18.463 回答