Obtener un puntero JNIEnv válido

Tengo un DLL de C ++ que quiero utilizar en la unidad exportando las funciones a C #. El proyecto Unity se ejecuta en dispositivos Android y el código C ++ hace uso de java. Para inicializar el C ++ necesito primero llamar a la función siguiente:

void api_initialize(JNIEnv* env, jobject* app_context, jobject* class_loader) { JavaVM* vm = nullptr; env->GetJavaVM(&vm); if (!vm) { return; } //Do other proprietary things } 

En Unity tengo la siguiente función Dll exportada

  [DllImport (dllName)] private static extern void api_initialize (IntPtr java_env, IntPtr app_context, IntPtr class_loader); 

Mi pregunta es ¿Cómo puedo obtener un puntero JNIEnv en mi clase C # para luego pasar como un parámetro en esta función?

No soy el creador de esta API y no tengo el acceso para modificarla, así que necesito conseguir el JavaVM del JNIEnv, no al revés.

2 Solutions collect form web for “Obtener un puntero JNIEnv válido”

Creo que puedes crear otro plugin nativo que te dará JNIEnv.

Plugins para Android

Resumiendo este artículo debes intentar algo como esto (pseudo código no probado) :

 JavaVM* g_JVM; // JavaVM is valid for all threads, so just save it globally extern "C" { JNIEnv* GetJniEnv(); } // The VM calls JNI_OnLoad when the native library is loaded jint JNI_OnLoad(JavaVM* vm, void* reserved) { g_JVM = vm; return JNI_VERSION_1_6; } // The JNI interface pointer (JNIEnv) is valid only in the current thread. JNIEnv* GetJniEnv() { JNIEnv* jni_env = 0; g_JVM->AttachCurrentThread(&jni_env, 0); return jni_env; } 

Entonces en C #

 [DllImport ("PluginName")] private static extern IntPtr GetJniEnv(); 

Supongo que no hay manera de que usted puede hacer esto (podría estar allí, pero no lo han visto todavía), porque este tipo de NDK calls requiere java envoltura por lo que me gustaría a propósito una otra solución que utilizan Java como un intermediate para su C # y luego puede redirect esta llamada al NDK code de java .

 using UnityEngine; using System.Collections; using System.IO; #if UNITY_ANDROID public class JavaCallPlugin { // Avoid invalid calls public static void initiateNDK() { if (Application.platform != RuntimePlatform.Android) return; var pluginClass = new AndroidJavaClass("com.package.class.UnityJavaDelegate"); AndroidJavaObject plugin = pluginClass.CallStatic<AndroidJavaObject>("obj"); return plugin.Call("javaCallToNDK"); } } #endif 

Y en tu archivo java haz esto

 package com.package.class; import android.content.ContentValues; import android.content.Intent; import android.os.Environment; public class UnityJavaDelegate{ private static UnityJavaDelegate obj; // define function call to your NDK method with native keyword private native void api_initialize(); static { System.loadLibrary("yourlibraryname"); // setup your ndk lib to use } public static UnityJavaDelegate getObj() { if(m_instance == null) obj= new UnityJavaDelegate(); return obj; } private UnityJavaDelegate(){ } public void javaCallToNDK(){ // this call may not work because i haven't passed class // loader TO NDK before, if not then you should try links // at the bottom of the post to know how to pass customize // as parameter to NDK. // put your call to NDK function here api_initialize(this.getClass().getClassLoader()); } } 

Cuando usted declara el método nativo el javah genera automáticamente una definición de la llamada del ndk con el javaEnv y el jobject como el parámetro así que supongo que usted necesita solamente pasar el cargador de la clase aquí. Usted puede intentar este acoplamiento y esto liga en caso de más aclaración.

Good Luck.Hope Esto ayudará.

  • Error al crear el reproductor: IOException: Error al mover el archivo
  • ¿Cómo recuperar la ID de juegos de google con la nueva actualización de juegos de Google ID de jugador?
  • Android / Gradle / Unity - incluye todas las dependencias en el complemento AAR
  • Cómo ocultar InputField caja de entrada adicional en unity3d
  • Error de codificación de vídeo que utiliza datos OnAudioFilterRead
  • ¿Requisitos mínimos para Unity para Android?
  • Unity3d - Hilo de interfaz de usuario independiente para Android
  • MonoGame vs Unity3D
  • Problema con el desarrollo de GearVR después de exportar como Google Android Project
  • ¿Es práctico iniciar un juego de Unity desde una aplicación de Android y volver de Unity a la aplicación?
  • Doloroso Unity proyecto de exportación a Android cada construcción (estoy haciendo algo mal)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.