我有一个需要在本机代码中调用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()
一样。谁能帮我这个?我只想采用这种方法或任何现有的博客都可以帮助我。
谢谢!
答案 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;
}