2013-04-02 61 views
3

以下代碼爲jni創建java數組的int數組, 爲什麼我們需要創建一個temp []數組,爲什麼我們不能只填充結果[]數組並將其返回給java。是否因爲java和jni應該使用不同的內存空間,因此兩個不同的指針?如果是這樣,那麼目的是什麼?謝謝爲什麼需要創建一個用於將數組從jni返回給java的臨時數組

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 temp[256]; 
for (i = 0; i < size; i++) { 
    temp[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, temp); 
return result; 
} 

回答

2

原因是,你不能直接修改jinitArray中的對象,因爲它們是Java對象而不是C的。

在你的例子中,你創建一個C的數組,並將其移動到Java結構。在更改數組內容時,必須遵守相同的方法。你需要一個訪問器來提供C的數組。

示例如何使用JNI修改數組。

JNIEXPORT jintArray JNICALL Java_SendArray_loadFile(JNIEnv *env, jobject obj, jintArray input) { 

    // Convert incoming JNI jinitarray to C's native jint[] 
    jint *inputArray = env->GetIntArrayElements(env, input, NULL); // if last param JNI_TRUE, then a copy is returned. 

    if(NULL == inputArray) { 
     return NULL ; 
    } 

    const jsize length = env->GetArrayLength(input); 

    for (int i = 0; i < length; i++) { 
     inputArray[n] = 0; //We can operate on native jinit[] elements. 
    } 

    // Convert the C's native jinit[] int JNI jinitarray 
    env->ReleaseIntArrayElements(env, input, inputArray, 0); // 0 - copy back the content and free the `input` buffer 

    return inputArray; 
} 

原因是在Java數組中是一個類似於類的引用類型。這就是爲什麼你需要在JNI數組和本地數組之間進行轉換。

注意: 提出關於示例引用int類型。 JNI爲基本類型(布爾型,短型,字符型,字節型,整型,長型,浮點型,雙精度型)定義了九種類型的數組8,另一種用於對象。

參考:

Get< PrimitiveType>ArrayElements Routines

Java Programming Tutorial Java Native Interface

Accessing Java Arrays

+0

在你的榜樣,什麼是env-> GetIntArrayElements(輸入,NULL)究竟回報?內存中輸入的地址?如果是這樣,inputArray和輸入應該是完全相同的元素? – henryyao

+0

該方法有一個錯字,但我修復了它。它返回的是指向數組元素的指針(如果失敗,則返回null)。 'input',使用'GetIntArrayElements'存儲指向'inputArray'的指針,您可以獲取該指針或根據最後一個參數(true/false)創建一個副本。它與「輸入」不同。 –

相關問題