【问题标题】:Call Java Enum method from JNI从 JNI 调用 Java Enum 方法
【发布时间】:2018-07-26 20:32:00
【问题描述】:

我有一个场景,我需要在本机代码中调用枚举方法。这个枚举是在 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() 一样。谁能帮我这个?我只想找到可以帮助我的方法或任何现有的博客。

谢谢!

【问题讨论】:

  • 枚举常量只是一个字段。获取类Pool,获取字段JNIPOOL,读取它的value, call getBitmap`的值。
  • @JohannesKuhn 请查看更新后的描述。我在 JNIPOOL 后面有一些与其他池不同的自定义逻辑。而且我希望在本地调用中触发 JNIPOOL 逻辑。
  • 没关系。

标签: java android enums java-native-interface


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多