使用Xamarin的NDK Android应用程序中的DllNotFoundException

时间:2016-08-23 21:31:33

标签: android c++ xamarin android-ndk

我想创建一个使用NDK和C ++的Android应用程序

我在Xamarin Studio中创建了一个名为ndkTest的新Android App解决方案。我添加了一个文件夹jni,并在那里添加了这些文件:

  • Android.mk
  • Application.mk
  • my.h
  • TEST.CPP

以下是每个内容:

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

这里有趣的地方: 我已经安装并正确配置了ndk。在命令行中,我cd到项目目录并运行

ndk-build

我收到了这个错误:

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.

这很奇怪,但无论如何,我可以在Android.mk中指定test.cpp的完整路径并构建:

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

所以现在我有了.so文件。将此添加到MainActivity.cs的顶部后:using System.Runtime.InteropServices;我添加了这个:

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

我在OnCreate中添加了一个调用。我得到了DllNotFoundException。 我错过了什么?

2 个答案:

答案 0 :(得分:0)

如果我不得不猜测,我说你应该在你的DllImport声明中将libndkTest重命名为ndkTest。

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

我目前无法测试您的版本,但这样做对我有用。

我认为你已经完成了它但你应该仔细检查你的库构建操作和位置,它应该在lib / your_abi / your_lib.so下。我记得因为嗅探路径错误而撞了我的头2天......

答案 1 :(得分:0)

我找到了解决方法:

在Xamarin Studio中,转到“项目选项”,“构建”,“Android构建”,然后在“高级”选项卡中,取消选中除armeabi-v7a之外的所有受支持的ABI。出于某种原因,该应用程序不使用arm64-v8a在三星S6上工作,即使它显然应该。

YMMV