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?
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
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 –
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