2013-02-23 41 views
3

我是Java编程新手,有一个基本问题。我想将一个字符串数组传递给JNI层。在JNI函数内部可以用字符串填充数组?所有的帖子要么讨论如何从JNI层返回一个字符串数组,或者如何解析JNI层中的字符串数组。可能吗?在JNI层填充一个字符串数组

谢谢

+0

您可以引用任何现有的jni启动程序代码。你有看看http://git.eclipse.org/c/equinox/rt.equinox.framework.git/tree/bundles/org.eclipse.equinox.executable/ – Jayan 2013-02-23 13:32:04

回答

2

是的,这是可能的。有一个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); 
} 
+1

我想添加一般警告从在JNI中为Java构建复杂的数据结构。如果你没有做好你希望通过JNI代码正确执行的事情,这可能会使你陷入热水中。就像一个例子:链接列表有一些严重的缺陷:在调用'NewObjectArray'之后,它应该被检查如果'ExceptionOccured'。创建新的字符串对象也是如此。当然,有时候这样做是没有办法的,但在这种情况下请记住,你正在一个雷区内移动。 – junix 2013-02-23 13:44:56

+0

感谢回复。这个有效的代码?如果displayarray已经在java层分配了内存。这个例子只讲述了从JNI返回一个新构造的字符串数组。我们可以使用JNIEXPORT jboolean JNICALL Java _ ***(JNIEnv * env,jobject obj,jobjectArray displayArray){string}。对于(int i = 0; i GetObjectArrayElement(displayArray,i); jstring tempString =(env) - > NewStringUTF(“Hello”); string = tempString; free(tempString); } return false; } – 2013-02-23 14:13:33

+0

请参阅http://stackoverflow.com/questions/5859673/should-you-call-releasestringutfchars-if-getstringutfchars-returned-a-copy以正确的方式释放JNI代码中的Java字符串。 (简而言之,JNI机制可能为您的字符串分配额外的内存,必须明确释放)。 – Javier 2013-02-23 14:22:53