DllNotFoundException en la aplicación de Android de NDK usando Xamarin

Quiero crear una aplicación para Android que utilice NDK con C ++

Hice una nueva solución para Android en Xamarin Studio llamada ndkTest. He añadido una carpeta jni, y en allí agregó estos archivos:

  • Android.mk
  • Application.mk
  • mi h
  • test.cpp

Aquí están los contenidos de cada uno:

Android.mk :

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ndkTest LOCAL_SRC_FILES := test.cpp LOCAL_STATIC_LIBRARIES := my include $(BUILD_SHARED_LIBRARY) 

Application.mk :

 APP_ABI := armeabi-v7a APP_STL := stlport_static 

mi h

 #ifndef __MY_H__ #define __MY_H__ #define MY_CONST 1 #ifdef __cplusplus extern "C" #endif short my_func( short my_param ); #endif /* __MY_H__ */ 

test.cpp :

 // test.cpp // #include <stdio.h> #include <stdlib.h> #include <string.h> #include <memory.h> #include <iostream> #include <fstream> #include <vector> #include "my.h" #define SOME_CONST 2*MY_CONST short some_short; #ifdef __cplusplus extern "C" { #endif static void static_func_0() { some_short = 0; } static void static_func_1() { some_short = 1; } #ifdef __cplusplus } #endif static void static_print() { printf("static_print\n"); printf("some_short = %d\n", some_short); } extern "C" short getSomeShort() { printf("myExtern\n"); return some_short; } 

Aquí es donde se pone interesante: Tengo ndk instalado y configurado correctamente. En la línea de comandos, cd al directorio del proyecto y ejecutar

 ndk-build 

Y me sale este error:

 make.exe: *** No rule to make target [path to ndk]/sources/cxx-stl/stlport/test.cpp', needed byobj/local/armeabi/objs/ndkTest/test.o'. Stop. 

Eso es raro, pero lo que sea, puedo especificar la ruta completa a test.cpp en Android.mk y se construye:

 [armeabi] Compile++ thumb: ndkTest <= test.cpp [armeabi] SharedLibrary : libndkTest.so [armeabi] Install : libndkTest.so => libs/armeabi/libndkTest.so 

Así que ahora tengo el archivo .so. Después de agregar esto a la parte superior de MainActivity.cs: using System.Runtime.InteropServices; He añadido esto:

 [DllImport("libndkTest", EntryPoint="getSomeShort")] static extern short getSomeShort(); 

Y agregué una llamada a eso en OnCreate. Estoy recibiendo una DllNotFoundException . ¿Qué me estoy perdiendo?

Si tuviera que tomar una conjetura diría que usted debe renombrar libndkTest a ndkTest en su declaración de DllImport.

 [DllImport("ndkTest")] static extern short getSomeShort(); 

Actualmente no puedo probar tu versión, pero estaba funcionando para mí de esta manera.

Y supongo que ya lo has hecho, pero deberías revisar la acción y la ubicación de la compilación de la biblioteca, debería estar en lib / your_abi / your_lib.so. Recuerdo golpear mi cabeza por 2 días debido a un error de la ruta de sniffing …

He encontrado una solución:

En Xamarin Studio, vaya a Opciones de proyecto, Construir, Android Build y, en la pestaña Avanzado, desmarque todas las ABI admitidas excepto armeabi-v7a. Por alguna razón, la aplicación no funciona en un Samsung S6 utilizando arm64-v8a, aunque claramente debería.

YMMV

  • Error después de actualizar la AppCompat de Android.Support Library v7 a la versión 21.0.3
  • Xamarin-Android Mvvmcross - Tocar en la aplicación de inicio de notificación recibida con salpicaduras o llevar al frente
  • Problemas de recursos de Android después de actualizar a Xamarin Forms 2.0
  • Tabs Deslizar dirección en la aplicación de Android de derecha a izquierda
  • Evitar el cierre por botón de nuevo en formularios xamarin en android
  • Botón de acción flotante Desplazamiento comportamiento extraño
  • Construye una biblioteca jar con Xamarin
  • Enlace Xamarin.Android definiendo Getter / Setter Métodos usando EnumMethods.xml para la interfaz
  • ¿Cómo tratar con "$ {applicationid}" en Xamarin?
  • Problemas al implementar la versión de la aplicación Xamarin.Android
  • Actividad requiere FLAG_ACTIVITY_NEW_TASK Indicador
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.