Remove of static JNI fields (#2400)

Static JNI lookups were causing issues with multiple libraries.
We now do the lookups when we need them as they are effectively
just hashmap lookups and we do them only in places where the
work we need to perform will be much larger than a simple hash
map lookup anyway.

This chane also manually registers filament-utils JNI bindings
to get rid of unnecessary symboles. We should do the same for
other Filament libraries (the symbols are pretty long and
we now have many of them).
This commit is contained in:
Romain Guy
2020-04-16 09:00:54 -07:00
committed by GitHub
parent e7df636368
commit 9b1a0e2f58
10 changed files with 114 additions and 159 deletions

View File

@@ -22,12 +22,6 @@
using namespace filament;
struct {
jclass parameterClass;
jmethodID parameterAdd;
jfieldID parameterSamplerOffset;
} gMaterial;
extern "C" JNIEXPORT jlong JNICALL
Java_com_google_android_filament_Material_nBuilderBuild(JNIEnv *env, jclass,
jlong nativeEngine, jobject buffer_, jint size) {
@@ -191,16 +185,27 @@ Java_com_google_android_filament_Material_nGetParameters(JNIEnv* env, jclass,
size_t received = material->getParameters(info, (size_t) count);
assert(received == count);
jint offset = env->GetStaticIntField(gMaterial.parameterClass, gMaterial.parameterSamplerOffset);
jclass parameterClass = env->FindClass("com/google/android/filament/Material$Parameter");
parameterClass = (jclass) env->NewLocalRef(parameterClass);
jmethodID parameterAdd = env->GetStaticMethodID(parameterClass, "add",
"(Ljava/util/List;Ljava/lang/String;III)V");
jfieldID parameterSamplerOffset = env->GetStaticFieldID(parameterClass,
"SAMPLER_OFFSET", "I");
jint offset = env->GetStaticIntField(parameterClass, parameterSamplerOffset);
for (size_t i = 0; i < received; i++) {
jint type = info[i].isSampler ? (jint) info[i].samplerType + offset : (jint) info[i].type;
env->CallStaticVoidMethod(
gMaterial.parameterClass, gMaterial.parameterAdd,
parameterClass, parameterAdd,
parameters, env->NewStringUTF(info[i].name), type, (jint) info[i].precision,
(jint) info[i].count);
}
env->DeleteLocalRef(parameterClass);
delete[] info;
}
@@ -221,14 +226,3 @@ Java_com_google_android_filament_Material_nHasParameter(JNIEnv* env, jclass,
env->ReleaseStringUTFChars(name_, name);
return (jboolean) hasParameter;
}
void registerMaterial(JNIEnv *env) {
gMaterial.parameterClass = env->FindClass("com/google/android/filament/Material$Parameter");
gMaterial.parameterClass = (jclass) env->NewGlobalRef(gMaterial.parameterClass);
gMaterial.parameterAdd = env->GetStaticMethodID(gMaterial.parameterClass, "add",
"(Ljava/util/List;Ljava/lang/String;III)V");
gMaterial.parameterSamplerOffset = env->GetStaticFieldID(gMaterial.parameterClass,
"SAMPLER_OFFSET", "I");
}