从JNI

时间:2018-07-26 11:14:09

标签: java android enums java-native-interface

我有一个需要在本机代码中调用enum方法的场景。这个枚举是用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);
    }
}

我有一些引用,可以从JNI调用对象方法,但就我而言,我需要调用已创建的对象方法。就像我需要从本机代码调用JNIPOOL.getBitmap()一样。谁能帮我这个?我只想采用这种方法或任何现有的博客都可以帮助我。

谢谢!

1 个答案:

答案 0 :(得分:1)

正如我已经说过的,枚举常量只是一个字段。

为了测试我的解决方案,我使用了具有以下签名的本机方法:

private static native Bitmap callBitmap(int width, int height);
test.JNITest类中为

。这是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;
}