0

この本でJNIの使い方を学んでいます。JavaとC++を通信するために使用しています。この本の 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

本に間違いがあると思いますが、JNIの仕様を見てみると、次のように宣言されています。

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

jbyteと同じsigned charです。jni.h で確認できます。

#ifdef HAVE_INITTYPES_H
# include <inttypes.h>     /* C99 */
typedef int8_t jbyte;
...
#else
typedef signed char jbyte;
...

GetStringUTFCharsjni.h で 3 つの引数を取るように定義されていますが、この行でもエラーが発生しないのは奇妙です! 最後の引数はjboolean*、コピーが作成されたかどうかを示すものです。

関数の戻り値の型は、const char*Java 6 および 7 の Oracle Web サイトで定義されており、Android NDK の jni.h ファイルでも定義されています。NDK は、次のことを示すコメントを追加します。

JNI 仕様では、これは を返すと書かれていますがconst jbyte*、それは矛盾しています

そのため、古い仕様ではconst jbyte*、それがあなたの本がこのタイプを使用している理由である、または仕様が修正されており、あなたの本が古くなっていると述べている可能性があります。

char*また、C では (const かどうかに関係なく) からへの変換が許可されていますsigned char*が、C++ では許可されていないため、エラーが発生します。

于 2013-10-17T19:00:13.113 に答える