我是Java編程新手,有一個基本問題。我想將一個字符串數組傳遞給JNI層。在JNI函數內部可以用字符串填充數組?所有的帖子要麼討論如何從JNI層返回一個字符串數組,或者如何解析JNI層中的字符串數組。可能嗎?在JNI層填充一個字符串數組
謝謝
我是Java編程新手,有一個基本問題。我想將一個字符串數組傳遞給JNI層。在JNI函數內部可以用字符串填充數組?所有的帖子要麼討論如何從JNI層返回一個字符串數組,或者如何解析JNI層中的字符串數組。可能嗎?在JNI層填充一個字符串數組
謝謝
是的,這是可能的。有一個example here,正是你想要的。您將需要在java中創建數組和JNI方面的字符串(類似於調用new String(char[])
)。支持Unicode和UTF-8(每個都有一個JNI函數集)。
#include <jni.h>
#include "ArrayHandler.h"
JNIEXPORT jobjectArray JNICALL Java_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj)
{
jobjectArray ret;
int i;
char *message[5]= {"first",
"second",
"third",
"fourth",
"fifth"};
ret= (jobjectArray)env->NewObjectArray(5,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
for(i=0;i<5;i++) {
env->SetObjectArrayElement(
ret,i,env->NewStringUTF(message[i]));
}
return(ret);
}
我想添加一般警告從在JNI中爲Java構建複雜的數據結構。如果你沒有做好你希望通過JNI代碼正確執行的事情,這可能會使你陷入熱水中。就像一個例子:鏈接列表有一些嚴重的缺陷:在調用'NewObjectArray'之後,它應該被檢查如果'ExceptionOccured'。創建新的字符串對象也是如此。當然,有時候這樣做是沒有辦法的,但在這種情況下請記住,你正在一個雷區內移動。 – junix 2013-02-23 13:44:56
感謝回覆。這個有效的代碼?如果displayarray已經在java層分配了內存。這個例子只講述了從JNI返回一個新構造的字符串數組。我們可以使用JNIEXPORT jboolean JNICALL Java _ ***(JNIEnv * env,jobject obj,jobjectArray displayArray){string}。對於(int i = 0; i
請參閱http://stackoverflow.com/questions/5859673/should-you-call-releasestringutfchars-if-getstringutfchars-returned-a-copy以正確的方式釋放JNI代碼中的Java字符串。 (簡而言之,JNI機制可能爲您的字符串分配額外的內存,必須明確釋放)。 – Javier 2013-02-23 14:22:53
您可以引用任何現有的jni啓動程序代碼。你有看看http://git.eclipse.org/c/equinox/rt.equinox.framework.git/tree/bundles/org.eclipse.equinox.executable/ – Jayan 2013-02-23 13:32:04