add JNI_OnLoad to Android library. This is needed to manually call ::filament::backend::VirtualMachineEnv::JNI_OnLoad
This commit is contained in:
@@ -1,16 +1,68 @@
|
|||||||
#include <android/native_window_jni.h>
|
#include <android/log.h>
|
||||||
#include <android/native_activity.h>
|
#include <android/native_activity.h>
|
||||||
|
#include <android/native_window_jni.h>
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <android/log.h>
|
||||||
|
|
||||||
|
typedef void (*JNI_OnLoad_Func)(JavaVM*);
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
JNIEXPORT jlong JNICALL Java_dev_thermion_android_NativeWindowHelper_00024Companion_getNativeWindowFromSurface(
|
JNIEXPORT jlong JNICALL
|
||||||
JNIEnv* env,
|
Java_dev_thermion_android_NativeWindowHelper_00024Companion_getNativeWindowFromSurface(
|
||||||
jclass clazz,
|
JNIEnv *env, jclass clazz, jobject surface) {
|
||||||
jobject surface
|
ANativeWindow *window = ANativeWindow_fromSurface(env, surface);
|
||||||
) {
|
|
||||||
ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
|
|
||||||
return (jlong)window;
|
return (jlong)window;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) {
|
||||||
|
|
||||||
|
void* filamentLib = dlopen("libthermion_dart.so", RTLD_NOW);
|
||||||
|
if (!filamentLib) {
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "thermion_android",
|
||||||
|
"Failed to load Filament library: %s", dlerror());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dlerror();
|
||||||
|
|
||||||
|
JNI_OnLoad_Func vmEnvOnLoad = (JNI_OnLoad_Func)dlsym(filamentLib,
|
||||||
|
"_ZN8filament17VirtualMachineEnv10JNI_OnLoadEP7_JavaVM");
|
||||||
|
|
||||||
|
// Check for errors
|
||||||
|
const char* dlsym_error = dlerror();
|
||||||
|
if (dlsym_error) {
|
||||||
|
__android_log_print(ANDROID_LOG_ERROR, "thermion_android",
|
||||||
|
"Failed to find VirtualMachineEnv::JNI_OnLoad: %s", dlsym_error);
|
||||||
|
dlclose(filamentLib);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the function
|
||||||
|
vmEnvOnLoad(vm);
|
||||||
|
|
||||||
|
|
||||||
|
JNIEnv *env;
|
||||||
|
if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
|
||||||
|
return JNI_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
jclass c =
|
||||||
|
env->FindClass("dev/thermion/android/NativeWindowHelper$Companion");
|
||||||
|
if (c == nullptr)
|
||||||
|
return JNI_ERR;
|
||||||
|
|
||||||
|
static const JNINativeMethod methods[] = {
|
||||||
|
{"getNativeWindowFromSurface", "(Landroid/view/Surface;)J",
|
||||||
|
reinterpret_cast<void *>(
|
||||||
|
Java_dev_thermion_android_NativeWindowHelper_00024Companion_getNativeWindowFromSurface)},
|
||||||
|
};
|
||||||
|
int rc = env->RegisterNatives(c, methods,
|
||||||
|
sizeof(methods) / sizeof(JNINativeMethod));
|
||||||
|
if (rc != JNI_OK)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
return JNI_VERSION_1_6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -25,9 +25,6 @@ import java.util.*
|
|||||||
|
|
||||||
class NativeWindowHelper {
|
class NativeWindowHelper {
|
||||||
companion object {
|
companion object {
|
||||||
init {
|
|
||||||
System.loadLibrary("thermion_flutter_android")
|
|
||||||
}
|
|
||||||
external fun getNativeWindowFromSurface(surface: Surface): Long
|
external fun getNativeWindowFromSurface(surface: Surface): Long
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,6 +59,9 @@ class ThermionFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
|
|||||||
this.flutterPluginBinding = flutterPluginBinding
|
this.flutterPluginBinding = flutterPluginBinding
|
||||||
channel = MethodChannel(flutterPluginBinding.binaryMessenger, CHANNEL_NAME)
|
channel = MethodChannel(flutterPluginBinding.binaryMessenger, CHANNEL_NAME)
|
||||||
channel.setMethodCallHandler(this)
|
channel.setMethodCallHandler(this)
|
||||||
|
Log.d("thermion_flutter", "Loading library")
|
||||||
|
System.loadLibrary("thermion_flutter_android")
|
||||||
|
Log.d("thermion_flutter", "Loaded")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
|
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
|
||||||
@@ -81,7 +81,7 @@ class ThermionFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
|
|||||||
result.error("DIMENSION_MISMATCH", "Both dimensions must be greater than zero (you provided $width x $height)", null)
|
result.error("DIMENSION_MISMATCH", "Both dimensions must be greater than zero (you provided $width x $height)", null)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
Log.i("thermion_flutter", "Creating SurfaceTexture ${width}x${height}")
|
Log.d("thermion_flutter", "Creating SurfaceTexture ${width}x${height}")
|
||||||
|
|
||||||
val surfaceTextureEntry = flutterPluginBinding.textureRegistry.createSurfaceTexture()
|
val surfaceTextureEntry = flutterPluginBinding.textureRegistry.createSurfaceTexture()
|
||||||
val surfaceTexture = surfaceTextureEntry.surfaceTexture()
|
val surfaceTexture = surfaceTextureEntry.surfaceTexture()
|
||||||
@@ -95,6 +95,8 @@ class ThermionFlutterPlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
|
|||||||
val flutterTextureId = surfaceTextureEntry.id()
|
val flutterTextureId = surfaceTextureEntry.id()
|
||||||
textures[flutterTextureId] = TextureEntry(surfaceTextureEntry, surfaceTexture, surface)
|
textures[flutterTextureId] = TextureEntry(surfaceTextureEntry, surfaceTexture, surface)
|
||||||
//val surface = surfaceView.holder.surface
|
//val surface = surfaceView.holder.surface
|
||||||
|
Log.d("thermion_flutter", "Loading library")
|
||||||
|
System.loadLibrary("thermion_flutter_android")
|
||||||
val nativeWindowPtr = NativeWindowHelper.getNativeWindowFromSurface(surface)
|
val nativeWindowPtr = NativeWindowHelper.getNativeWindowFromSurface(surface)
|
||||||
//val nativeWindow = _lib.get_native_window_from_surface(surface as Object, JNIEnv.CURRENT)
|
//val nativeWindow = _lib.get_native_window_from_surface(surface as Object, JNIEnv.CURRENT)
|
||||||
result.success(listOf(flutterTextureId, flutterTextureId, nativeWindowPtr))
|
result.success(listOf(flutterTextureId, flutterTextureId, nativeWindowPtr))
|
||||||
|
|||||||
Reference in New Issue
Block a user