JNI学習2:文字列パラメータの伝達と戻り値
プログラミングの際には無パラメータの関数だけでなく,パラメータのある関数も必要である.
今回はStringタイプのパラメータを渡す関数を作成し、その関数の戻り値を出力します.
Javaクラスの作成:
コマンドラインインタフェースで、コマンドコンパイルを入力します:javac StringFunction.java
.classを生成したら、コマンドの入力を続行します:javah –jni StringFunction
次にStringFunction.hが生成され、cファイルStringFunction.cの作成が開始されます.
Cコードは以下の通りである.
コード作成後、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
今回は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