JNI学習2:文字列パラメータの伝達と戻り値

1912 ワード

プログラミングの際には無パラメータの関数だけでなく,パラメータのある関数も必要である.
今回はStringタイプのパラメータを渡す関数を作成し、その関数の戻り値を出力します.
Javaクラスの作成:
class StringFunction
{
	private native String getWords(String hint);
	static
	{
		System.loadLibrary("StringFunction");
	}
	public static void main(String [] args)
	{
		StringFunction sf = new StringFunction();
		String hint = "say something: ";
		String words = sf.getWords(hint);
		System.out.println("Get the words: " + words);
	}
}

コマンドラインインタフェースで、コマンドコンパイルを入力します:javac StringFunction.java
.classを生成したら、コマンドの入力を続行します:javah –jni  StringFunction
次にStringFunction.hが生成され、cファイルStringFunction.cの作成が開始されます.
Cコードは以下の通りである.
#include <jni.h>
#include "StringFunction.h"


JNIEXPORT jstring JNICALL Java_StringFunction_getWords(JNIEnv *env, jobject obj, jstring hint)
{
	char buf[128];	
	const char *str = (*env)->GetStringUTFChars(env, hint, NULL);//  1
	if(str == NULL)
	{//  2
		return NULL;
	}
	printf("%s", str);	
	(*env)->ReleaseStringUTFChars(env, hint, str);//  3
	scanf("%s", buf);	
	return (*env)->NewStringUTF(env, buf);//  4
}

コード作成後、StringFunction.cをDLLダイナミックリンクライブラリにコンパイルします(コンパイルがわかりませんか?ここを見てください).
プログラムを実行し、結果は次のとおりです.
分析:
注記1:jstringタイプをc言語のchar*タイプに直接変換することはできませんので、GetStringUTFcharsで操作します.GetStringUTFchars法は、UTF-8形式の文字列のポインタを得ることができる.
const jchar *GetStringChars(JNIEnv*env, jstring str, jboolean *isCopy);
isCopyがJNI_の場合TRUEの場合、元の文字列のコピーを返すことを示す.JNI_の場合FALSEは、ソース文字列を直接返すポインタを表します.通常はNULLです.インスタンスが返されるか、ソース文字列を指すポインタが返されるかは気にしません.
注記2:java仮想マシンのメモリ領域の割り当てに失敗する可能性があるため、ここで判断しなければなりません.
注記3:GetStringCharsを使用すると、ReleaseStringUTFcharsメソッドを呼び出してメモリを解放し、解放しないとメモリが漏れる可能性があります.
注記4:UTF-8の文字列bufをStringタイプに変換する
転載は出典をご説明ください~
テキストリンク:http://blog.csdn.net/zgyulongfei/article/details/7390658