0

JNI を使用して、C から Java に長い配列を返さなければならないコードを書いています。しかし、メソッド (*env)->FindClass は、何を試しても NULL を返します。

これが私のコードです:

// Returns a 2D long array from C to Java
JNIEXPORT jobjectArray JNICALL Java_awax_tools_AcquisitionWrapper_startAcquisition (JNIEnv *env, jobject obj) {

    // (...) Acquisition code

    // The 2D long array to return
    long** primitive2DArray = data;

    // Get the long array class
    jclass longArrayClass = (*env)->FindClass(env, "[java/lang/Long");

    // Check if we properly got the long array class
    if (longArrayClass == NULL) {
        // Ooops
        return NULL;
    }

    // Create the returnable 2D array
    jobjectArray myReturnable2DArray = (*env)->NewObjectArray(env, (jsize) length1D, longArrayClass, NULL);

    // Go through the firs dimension and add the second dimension arrays
    for (unsigned int i = 0; i < length1D; i++) {
        jlongArray longArray = (*env)->NewLongArray(env, length2D);
        (*env)->SetLongArrayRegion(env, longArray, (jsize) 0, (jsize) length2D, (jlong*) primitive2DArray[i]);
        (*env)->SetObjectArrayElement(env, myReturnable2DArray, (jsize) i, longArray);
        (*env)->DeleteLocalRef(env, longArray);
    }

    // Return a Java consumable 2D long array
    return myReturnable2DArray;
}

私も試しました:

(*env)->FindClass(env, "[L")
(*env)->FindClass(env, "[Long")
(*env)->FindClass(env, "[java.lang.Long")

しかし、どれも機能していないようです。

4

2 に答える 2

4

java.lang.Longオブジェクトの配列が本当に必要な場合は、 と書く必要があります[Ljava/lang/Long;。それらの配列を作成すると、どれがJava 側に[[Ljava/lang/Long;なるかがわかります。Long[][]

しかし、これは非常に非効率的です。その配列内のすべての数値に対してオブジェクトを作成する必要があります。を使用Long.valueOf するとキャッシュされたオブジェクトが得られますが、その配列内の多くの値が符号付きバイトに収まるとは思えません。

オブジェクトの代わりにLong、プリミティブlong値を使用する必要があります。コードの最初の行を除くすべてが既にそれを行っています。プリミティブの配列の正しい内部名longは次の[Jとおりです。

jclass longArrayClass = (*env)->FindClass(env, "[J");

コードの残りの部分は正しく、メソッドはlong[][].


ただし、注意してください。使用しているプラ​​ットフォームについては何も言っていませんが、たとえば Windows では、これはまだ機能しません。変装しlongているだけでint、32 ビット値でもあります。jlong一方、Aは常に 64 ビットでありlong long 、まさにその理由で a に typedef されます。やみくもにポインターをキャストしているため、コードは実際に持っているデータの 2 倍のデータをコピーしようとします。

于 2013-08-02T11:21:11.563 に答える