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:
- Async / esperar malas prácticas bajo Android?
- 2016-10-05 nivel de seguridad de nivel rompe Nexus-9 Xamarin
- Error de construcción de la arquitectura del procesador
- Java.lang.NoClassDefFoundError: android.support.v7.app.AppCompatDelegateImplV14 en Xamarin Android
- Mostrar mensaje para conocer la ubicación
- 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?
- Error al inflar el fragmento de clase, Xamarin
- Pasar datos de una actividad a otra en Xamarin.Android
- InstantiationException: No se puede instanciar fragmento Asegúrese de que el nombre de clase existe, es público y tiene un constructor vacío que es público
- ContextCompat.GetColor no devuelve Color
- Visual Studio y Android Device Monitor no detectan ningún dispositivo
- Android, Xamarin Formularios PCL, PortableRest PCL y Async Web Api Call
- El modo de bloqueo de DrawerLayout no funciona como se esperaba
- Android ScrollView establece la altura del contenido visualizado
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
- WeChat Integración a mi aplicación android para login
- Analizar matriz anidada dinámica en Android Retrofit