Enlace adecuado de una biblioteca nativa en Xamarin
Dado este método en una biblioteca c++
( Gifflen, animated gif maker ):
JNIEXPORT jint JNICALL Java_org_jiggawatt_giffle_Giffle_Init(JNIEnv *ioEnv, jobject ioThis, jstring gifName, jint w, jint h, jint numColors, jint quality, jint frameDelay) { ... }
Y esta firma para acceder a ella:
- Monogame archivo de carga de contenido no encontrado excepción
- MarkerClick funciona pero InfoWindowClick no abre ViewModel
- Xamarin mediaPicker.TakePhotoAsync bloquea la aplicación
- Xamarin extraña excepción en VS2015
- El botón Atrás de la barra de herramientas no funciona
extern "C" { JNIEXPORT jint JNICALL Java_org_jiggawatt_giffle_Giffle_Init(JNIEnv *ioEnv, jobject ioThis, jstring gifName, jint w, jint h, jint numColors, jint quality, jint frameDelay); }
¿No debería el p / invoke ser similar a eso?
[DllImport("libgifflen.so", CharSet = CharSet.Ansi)] public static extern int Java_org_jiggawatt_giffle_Giffle_Init(string gifName, int w, int h, int numColors, int quality, int frameDelay);
Tengo un programa que básicamente sólo intenta acceder a los métodos Init.
Estoy cargando la biblioteca correctamente: Java.Lang.JavaSystem.LoadLibrary("gifflen");
Entonces parece que estoy señalando el método correcto, pero se bloquea tan pronto como entra en el método.
Estoy llamando a Init con los mismos valores que en la aplicación demo java (y con básicamente los mismos valores que en todas mis otras implementaciones de este codificador gif, ya que es la misma base de código para todas las bibliotecas):
var pathForResult = "/storage/sdcard0/giftest/giffleResult.gif"; int optCol = 256, optQuality = 100, optDelay = 4; Giffle.Init (pathForResult , 256, 256, optCol, optQuality, optDelay);
Entonces estoy recibiendo este accidente:
[mono-rt] at <unknown> <0xffffffff> [mono-rt] at (wrapper managed-to-native) org.jiggawatt.giffle.Giffle.Java_org_jiggawatt_giffle_Giffle_Init (string,int,int,int,int,int) <IL 0x00046, 0xffffffff> [mono-rt] at org.jiggawatt.giffle.Giffle.Init (string,int,int,int,int,int) [0x00001] in c:\Users\user.name\Projects\Giffle\Giffle\Giffle.cs:20 [mono-rt] [mono-rt] Attempting native Android stacktrace: [mono-rt] [mono-rt] at Java_org_jiggawatt_giffle_Giffle_Init+19 [0x6433c83c] [mono-rt] at ???+12272 [0x6467fff0] [libc] Fatal signal 11 (SIGSEGV) at 0x6f7475d3 (code=1), thread 29670 (myapp.someapp)
¿Estoy usando bibliotecas nativas incorrectamente en mi aplicación Xamarin?
Código para enlaces
using System; using System.Runtime.InteropServices; namespace org.jiggawatt.giffle { public class Giffle { public const string GIFFLE_DLL_NAME = "libgifflen.so"; [DllImport(GIFFLE_DLL_NAME, CharSet = CharSet.Ansi)] public static extern int Java_org_jiggawatt_giffle_Giffle_Init(string gifName, int w, int h, int numColors, int quality, int frameDelay); [DllImport(GIFFLE_DLL_NAME, CharSet = CharSet.Ansi)] public static extern void Java_org_jiggawatt_giffle_Giffle_Close(); [DllImport(GIFFLE_DLL_NAME, CharSet = CharSet.Ansi)] public static extern int Java_org_jiggawatt_giffle_Giffle_AddFrame(int[] inArray); } }
Código de prueba
var external = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath; var appPath = System.IO.Path.Combine (external, "giftest"); if (!Directory.Exists (appPath)) { Directory.CreateDirectory (appPath); } var t = "/storage/sdcard0/giftest/result3.gif"; File.Delete (t); int optCol = 256, optQuality = 100, optDelay = 4; Giffle.Init (t, 256, 256, optCol, optQuality, optDelay); var image = Bitmap.CreateBitmap (256, 256, Bitmap.Config.Argb8888); for (int i = 0; i < 50; i++) { image = Bitmap.CreateBitmap (256, 256, Bitmap.Config.Argb8888); image.EraseColor (Color.Argb (255, 255 - i * 4, i * 4, i * 4)); int[] pixelsCopy = new int[image.Width * image.Height]; image.LockPixels (); image.GetPixels(pixelsCopy, 0, image.Width, 0, 0, image.Width, image.Height); image.UnlockPixels (); image.Recycle (); Giffle.Java_org_jiggawatt_giffle_Giffle_AddFrame (pixelsCopy); } Giffle.Java_org_jiggawatt_giffle_Giffle_Close ();
- Cómo establecer un atributo de id de android en Xamarin.Forms?
- Escribir aplicaciones para Android en C # (Xamarin)
- Adición de SearchView en el fragmento
- API de Android IsConnected devolviendo TRUE tras finalizar sesión
- No se puede instalar Xamarin.Android.Support.v4
- Xamarin Android: System.IO.Compression.ZipFile.ExtractToDirectory Error en el modo de liberación
- Mejor opción para la suscripción de eventos
- ¿Cómo puedo encontrar mi archivo de base de datos SQLite en mi computadora?
- Almacenamiento de clave secreta en KeyStore sin el parámetro ProtectionParameter
- Phonegap El teclado virtual cubre el campo de entrada