2016-08-23 1 views
4

Ich mag ein Android-App machen, die NDK verwendet, um mit C++DllNotFoundException in NDK Android App Xamarin

ich eine neuen Android-App-Lösung in Xamarin Studio gemacht genannt ndkTest. Ich habe einen Ordner jni und dort hinzugefügt, um diese Dateien:

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

Hier sind die Inhalte von jedem:

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 

my.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; 
} 

Hier wird es interessant: Ich habe ndk installiert und richtig konfiguriert. In der Befehlszeile ich cd Verzeichnis projizieren und

ndk-build 

Und ich bekomme diese Fehlermeldung führen:

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. 

Das ist seltsam, aber was auch immer, kann ich den vollständigen Pfad in Android test.cpp angeben .mk und es baut:

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

So jetzt habe ich die .so Datei. Nach der Zugabe von dieser nach oben MainActivity.cs: using System.Runtime.InteropServices; habe ich dies:

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

Und fügte ich einen Anruf, dass in OnCreate. Ich bekomme eine DllNotFoundException. Was fehlt mir?

+0

1) Sind Sie 'libndkTest.so' zu einem Projekt mit einer Build-Aktion von' AndroidNativeLibrary' Zugabe? 2) Testen Sie auf einem 'armeabi-v7a'-Gerät? – SushiHangover

+0

Wenn Sie die So-Datei zu Ihrem Projekt hinzufügen, muss sie sich in einem Ordner namens lib und einem anderen Ordner des Gerätetyps befinden. lib/armeabi/yourlib.so Wenn Sie auf einem Emulator laufen ihre Geräte-Typen sind in der Regel x86 Bearbeiten Sie Ihre Anwendung Makefile "APP_ABI: = armeabi-armabi-v7a x86" enthalten, um alle relevanten Dateien so zu erstellen –

+0

armee würde für arméabi-v7a überflüssig sein, es sei denn, das OP plant, ab 2009 an einem Telefon zu testen. – Michael

Antwort

0

fand ich eine Abhilfe:

In Xamarin Studio, zu Projektoptionen gehen, Bauen, Android-Build, und in der Registerkarte Erweitert, deaktivieren Sie alle unterstützten ABIs außer armeabi-V7A. Aus irgendeinem Grund funktioniert die App nicht auf einem Samsung S6 mit arm64-v8a, obwohl es deutlich sollte.

YMMV

0

Wenn ich eine Schätzung nehmen müsste, würde ich sagen, dass Sie in Ihrer DllImport-Anweisung ljndkTest zu ndkTest umbenennen sollten.

Ich kann derzeit Ihre Version nicht testen, aber es funktionierte für mich auf diese Weise.

Und ich nehme an, Sie haben es bereits getan, aber Sie sollten überprüfen Sie Ihre Bibliothek Build Aktion und Speicherort, sollte es unter lib/your_abi/your_lib.so sein. Ich erinnere mich, dass ich wegen eines Schnüffelwegfehlers zwei Tage lang meinen Kopf schlug ...