2009-10-22 18 views
102

Android NDK'yı kullanmaya çalışıyorum.JNI'den Java'ya nasıl bir dizi döndürülebilir?

JNI'den Java'ya oluşturulan bir diziyi (benim durumumda int[]) döndürmenin bir yolu var mı? Öyleyse, lütfen bunu yapacak olan JNI işlevinin hızlı bir örneğini sağlayın.

-Teşekkürler

Eğer belgelere incelenmiş ve hala ilk sorunuzu parçası olmalıdır sorunuz varsa

cevap

92

. Bu durumda, örnekte JNI işlevi, bir dizi dizi oluşturur. Dış dizi, JNI işlevi NewObjectArray() ile oluşturulmuş bir 'Nesne' dizisinden oluşur. JNI perspektifinden, bu iki boyutlu bir dizi, diğer bir dizi iç dizileri içeren bir nesne dizisidir.

Aşağıdaki for döngüsü, JNI işlevi NewIntArray() kullanılarak int (] türünde iç dizileri oluşturur. Yalnızca tek boyutlu bir boyut dizisi döndürmek istiyorsanız, NewIntArray() işlevi, dönüş değerini oluşturmak için kullandığınız işlevdir. Tek boyutlu bir Dizge dizisi oluşturmak isterseniz, NewObjectArray() işlevini kullanacaksınız, ancak sınıf için farklı bir parametreyle.

bir int dizi dönmek istediğimiz için

, sonra kod şuna benzer gidiyor:

JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size) 
{ 
jintArray result; 
result = (*env)->NewIntArray(env, size); 
if (result == NULL) { 
    return NULL; /* out of memory error thrown */ 
} 
int i; 
// fill a temp structure to use to populate the java int array 
jint fill[size]; 
for (i = 0; i < size; i++) { 
    fill[i] = 0; // put whatever logic you want to populate the values here. 
} 
// move from the temp structure to the java structure 
(*env)->SetIntArrayRegion(env, result, 0, size, fill); 
return result; 
} 
+0

Evet, bunu zaten yaptık. Sorunumu (sonuncusu) ilgilendiren bir örneği anlamakta sıkıntı çekiyordum ve birisinin int [] 'i geri döndürerek daha basit bir örneği açıklamayı aklından geçirir mi diye merak ediyordum. – RyanCheu

+0

DÜZENLEME: Lütfen önceki yorumumu dikkate almayın, yukarıdaki kod çalışır. Teşekkür ederiz! Bu çok yardımcı oldu. – RyanCheu

+3

EDIT2: Kod çalışır, ancak doldurmak için SetIntArrayRegion (...) içindeki tmp'yi değiştirmeniz gerekir. – RyanCheu

30

birisi String [] dizi dönmek için bilmek isterseniz:

java kod

private native String[] data(); 

yerli ihracat

JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject); 
012 bağlantısından

yerel kod

JNIEXPORT jobjectArray JNICALL 
       Java_example_data 
    (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); 
    } 

: http://www.coderanch.com/t/326467/java/java/Returning-String-array-program-Java

İlgili konular