Javaでは、作成しString
たオブジェクトは非常に簡単で、かつ使用できるString
メソッドクラスの様々な文字列を操作するのは非常に簡単です。JNIは、しかし、が、jstring
クラスは、Javaを表すString
クラスを、しかし、jstring
文字列を操作するために、任意の機能を提供していません。
エンコード形式
文字列定数のために、例えば"abc"
、JavaでありString
表すオブジェクト、および表すUTF-16
文字列(つまり、ダブルバイトコードである)形式。JNIでは、それはchar
しかし、符号化形式として、ポインタの種類が表されていますmodified UTF-8
。
だから何であるmodified UTF-8
符号化形式は?実際には、あるUTF-8
フォーマットは非常に似ていますが、少し違います
- ヌル文字(値0)で
UTF-8
バイトで表され、但しmodified UTF-8
、バイトは2で表されます。 - バイト、2バイト、3バイトの両方が同じで符号化された、文字で表すことができます。
- 文字を必要に応じて4バイトの場合、
modified。 UTF-8
2つの3バイトが達成使用。
あなたが理解したい場合
UTF-8
やmodified UTF-8
エンコーディング形式、最後のリンクを参照してください。
文字列操作のためのJNI関数は、両方のフォーマットのバージョンを持っています。今、私は2つのエンコード形式一般的な説明の文字列操作関数のために行います。
UTF-16文字列関数
NEWSTRING
jstring NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);
复制代码
パラメータ
jchar *unicodeChars
:ポインタUnicode
のポインタ文字列をエンコードされました。jsize len
:文字列の長さ。
NewString
使用するUnicode
エンコードされた文字のJava配列を作成するString
オブジェクトを。
使用NewString
鍵は、あなたが使用しなければならないということであるUnicode
エンコードされた文字列を、ここだUnicode
を指し、一般的にコーディングUTF-16
コード。しかし、どのように取得するUTF-16
エンコードされた文字列にそれを、この問題をこの資料の範囲を超えていますが、Androidの開発では、そこにあるString16
クラスは、コンストラクタは、文字列定数に置くことができるUTF-16
エンコードされた文字列を。
GetStringLength
jsize GetStringLength(JNIEnv *env, jstring string);
复制代码
パラメータ
jstring string
:JavaのString
オブジェクト。
GetStringLength
関数は、文字列の長さを返すとJava String
返される文字列の長さは同じであり、例えばString s = "中国";
、Java文字列の長さは2であり、そして例えばString s = "China";
、弦5の長さ。
GetStringChars
const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy);
复制代码
パラメータ
jstring string
:JavaはあるString
オブジェクトjboolean * isCopy
:もしisCopy
ないNULL
、と生成された関数は、文字列のコピーである*isCopy
値JNI_TRUE
のコピーは、生成されていない場合は、*isCopy
の値をJNI_FALSE
GetStringChars
それへのポインタを返しUnicode
エンコードされた文字の配列(おそらくはポインタへのポインタNULL
)。このポインタは、元の文字列の配列を指すことは、仮想マシンを実現によって、コピーされた文字の配列を指してもよいです。コピーが発生した場合、ネイティブの文字列を解放する必要があるが必要ですReleaseStringChars
。
ReleaseStringChars
void ReleaseStringChars(JNIEnv *env, jstring string, const jchar *chars);
复制代码
パラメータ
jstring string
:JavaはあるString
オブジェクトjchar *chars
:によって指さGetStringChars
のリターンUnicode
文字の符号化された配列
ReleaseStringChars
ではない彼らの機能(コピーが発生した場合)ローカルの文字列を解放しませんが、仮想マシンにアクセスもはやネイティブコードに気づくためにjchar *chars
、仮想マシンと、その後、処理方法を決定します。
GetStringRegion
void GetStringRegion(JNIEnv *env, jstring str, jsize start,
jsize len, jchar *buf);
复制代码
パラメータ
jstring str
:JavaはあるString
オブジェクトjsize start
:開始位置のコピーjsize len
:コピー長jchar *buf
:コピー先バッファ
GetStringRegion
機能start
始まり、コピーlen
の長さはUnicode
文字buf
真ん中。
GetStringCritical&ReleaseStringCriticalの
const jchar * GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy);
void ReleaseStringCritical(JNIEnv *env, jstring string, const jchar *carray);
复制代码
Get/ReleaseStringCritical
機能とGet/ReleaseStringChars
使用および機能における機能は同じです。つまり、GetStringCritical
関数は、元の文字列へのポインタへのポインタを返すことができる、または実装し、仮想マシンに応じて、ソース文字列のポインタのコピーへのポインタを返します。コピーが発生した場合は、必要なReleaseStringCritial
仮想マシンをローカル操作を解除通知します。
修正UTF-8文字列関数
NewStringUTF
jstring NewStringUTF(JNIEnv *env, const char *bytes);
复制代码
NewStringUTF
第2のパラメータは、const char *bytes
あるmodified UTF-8
符号化されたバイト配列。
modified UTF-8
JNIは、このフォーマット文字列と使用される仮想マシンの文字列として、独自のフォーマットです。
使用JNI modified UTF-8
文字列型であるコードは、例えば、次の2行のコードは、この文字列を使用して符号化されます
const char * bytes1 = "中国";
const char * bytes2 = "China";
复制代码
文字列定数ので、デフォルトで作成されるmodified UTF-8
ので、エンコーディングNewStringUTF
最も一般的に、すべてのJava取得するために使用されているString
関数オブジェクトを。
GetStringUTFLength
jsize GetStringUTFLength(JNIEnv *env, jstring string);
复制代码
パラメータ
jstring string
:JavaはあるString
オブジェクト
GetStringUTFLength
この関数は返すmodified UTF-8
バイト長エンコード形式の文字列を。
、ことに注意してくださいGetStringUTFLength
それはのバイト長を返すGetStringLength
リターン文字長を。一つは、文字が強調され、バイトを強調することであるが、これは何か他のものです。例えば、Java文字列String s = "中国"
、GetStringUTFLength
6の値は、長さが6バイトの代表を返し、GetStringLength
戻り値は2であり、長さは2つの文字を表します。
GetStringUTFChars
const char * GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy);
复制代码
パラメータ
jstring string
:JavaのStringオブジェクトjboolean * isCopy
:もしisCopy
ないNULL
し、その後、元の文字列のコピーの機能であれば*isCopy
値がJNI_TRUE
、その後、コピーが発生しない場合は*isCopy
値JNI_FALSE
。
GetStringUTFChars
機能はへのポインタを返すmodified UTF-8
エンコードされたバイト配列のポインタを。
パラメータは、からisCopy
見ることができ、GetStringUTFChars
関数はバイト配列を指すポインタを返す文字列が離れて指し示すことができる、それがコピーされた文字列を指してもよいです。イベントのコピーは、その後、時間のこのコピーを必要としない場合は、あなたが呼び出すことができ、解放する必要があるReleaseStringUTFChars
機能を。
ReleaseStringUTFChars
void ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf);
复制代码
パラメータ
jstring string
:JavaはあるString
オブジェクトconst char *utf
:によってGetStringUTFChars
買収。
ReleaseStringUTFChars
機能は単に、ネイティブコードはもはやアクセスの仮想マシンに通知const char *utf
する仮想マシンに依存した後、処理動作。
GetStringUTFRegion
void GetStringUTFRegion(JNIEnv *env, jstring str, jsize start,
jsize len, char *buf);
复制代码
GetStringUTFRegion
機能とGetStringRegion
機能のパラメータがあることを除いて、同じGetStringUTFRegion
バッファの機能から文字にコピーされますUnicode
変換されたmodified UTF-8
形式。
使用
通常の状況下で、我々は、JNIのデフォルトを使用することを選択したmodified UTF-8
ことが便利であるので、トランスコーディングを必要とせず、エンコードされた文字列を。私たちが使用しなければならない場合やUTF-16
エンコードされた文字列を、あなたは変換する必要があります。
だから、より良いハンドリング文字列その中にどのようにJNI層?あなたがC ++開発JNIを使用している場合は、JNI層を使用することができますstring
文字列クラスを操作することができますが、C言語を使用する場合は、ステップ・プロセスによって文字ポインタのステップを使用する必要があります。
たとえば、Javaクラスが持つnative
メソッドを
public class Hello
{
native string getHelloFromJNI(String name);
}
复制代码
JNIとして実装対応する層に
static jstring getHello(JNIEnv *env, jobject thiz, jstring name)
{
// 从Java的String对象转换为本地表示
const char *c_name = env->GetStringUTFChars(name, NULL);
// 使用C++的string进行字符串拼接
string str("Hello, ");
str.append(c_name);
str.append("!");
env->ReleaseStringUTFChars(name, c_name);
// 创建Java的String对象并返回
return env->NewStringUTF(str.c_str());
}
复制代码
参照
修飾されたUTF-8エンコーディング
docs.oracle.com/javase/7/do...
ユニコード(UTF-8、UTF-16など)の符号化