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:

 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 (); 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.