我想创建一个使用NDK和C ++的Android应用程序
我在Xamarin Studio中创建了一个名为ndkTest的新Android App解决方案。我添加了一个文件夹jni,并在那里添加了这些文件:
以下是每个内容:
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
。
我错过了什么?
答案 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