J'ai un scénario où je dois appeler la méthode enum en code natif. Cette énumération est définie en Java.

public enum Pool {
    JNIPOOL(new SomePoolStrategyImp()),
    UIPOOL(new RandomPoolStrategyImp());

    private PoolStrategy poolStrategy;

    Pool(PoolStrategy poolStrategy) {
        this.poolStrategy = poolStrategy;
    }

    public Bitmap getBitmap(int width, int height) {
        // some logic
        // return poolStrategy.getBitmap(width, height);
    }
}

J'ai des références où les méthodes objet peuvent être appelées à partir de JNI mais dans mon cas, je dois appeler une méthode objet déjà créée. Comme si j'avais besoin d'appeler JNIPOOL.getBitmap() à partir du code natif. Est-ce que quelqu'un peut m'aider avec ça? Je veux juste l'approche ou tout blog existant qui peut m'aider dans ce domaine.

Merci!

1
Shashank 26 juil. 2018 à 14:14

1 réponse

Meilleure réponse

Comme je l'ai déjà dit, une constante enum n'est qu'un champ.

Pour tester ma solution, j'ai utilisé une méthode native avec la signature suivante :

private static native Bitmap callBitmap(int width, int height);

Dans la classe test.JNITest. Voici le code natif en C++ :

JNIEXPORT jobject JNICALL Java_test_JNITest_callBitmap
(JNIEnv * env, jclass clazz, jint width, jint height) {
    // Get a reference to the class
    jclass poolc = env->FindClass("test/Pool");
    // get the field JNIPOOL
    jfieldID jnipoolFID = env->GetStaticFieldID(poolc, "JNIPOOL", "Ltest/Pool;");
    jobject jnipool = env->GetStaticObjectField(poolc, jnipoolFID);

    // Find the method "getBitmap", taking 2 ints, returning test.Bitmap
    jmethodID getBitmapMID = env->GetMethodID(poolc, "getBitmap", "(II)Ltest/Bitmap;");

    // Call the method.
    jobject result = env->CallObjectMethod(jnipool, getBitmapMID, width, height);

    return result;
}
1
Johannes Kuhn 26 juil. 2018 à 15:32