VS2015跨平台Android和C++;
我正在使用Visual Studio 2015进行跨平台开发。我有现有的C++项目,希望Android端能调用它。我读过关于JNI的文章,但我使用VS2015 <>我可以调用C++非成员函数,但是我如何调用SyrdObjist.1.H.file中的函数(如以下函数乘法)VS2015跨平台Android和C++;,android,c++,visual-studio-2015,Android,C++,Visual Studio 2015,我正在使用Visual Studio 2015进行跨平台开发。我有现有的C++项目,希望Android端能调用它。我读过关于JNI的文章,但我使用VS2015 我可以调用C++非成员函数,但是我如何调用SyrdObjist.1.H.file中的函数(如以下函数乘法) class SharedObject1 { public: const char * getPlatformABI(); SharedObject1(); ~SharedObject1(); int
class SharedObject1
{
public:
const char * getPlatformABI();
SharedObject1();
~SharedObject1();
int Multiply(int a, int b);
};
在我的SharedObject1.cpp文件中:
#include "SharedObject1.h"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "SharedObject1", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "SharedObject1", __VA_ARGS__))
extern "C" {
/* This trivial function returns the platform ABI for which this dynamic native library is compiled.*/
const char * SharedObject1::getPlatformABI()
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
return "This native library is compiled with ABI: %s" ABI ".";
}
void SharedObject1()
{
}
SharedObject1::SharedObject1()
{
}
SharedObject1::~SharedObject1()
{
}
int Add(int a, int b)
{
return (a + b);
}
int SharedObject1::Multiply(int a, int b)
{
return (a*b);
}
}
因此,现在我可以在VS2015中将SharedObject1.So文件添加到下面的项目后,从Android端调用函数Add(),然后使用DllImport:
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Runtime.InteropServices;
namespace App1
{
[Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
int count = 1;
[DllImport("SharedObject1.so")]
public static extern int Add(int a, int b);
[DllImport("SharedObject1.so")]
public static extern int Multiply(int a, int b);
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
// Get our button from the layout resource,
// and attach an event to it
Button button = FindViewById<Button>(Resource.Id.MyButton);
button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
try
{
EditText TV1 = FindViewById<EditText>(Resource.Id.editText1);
int c1 = Add(4, 6);
TV1.Text = c1.ToString();
EditText TV2 = FindViewById<EditText>(Resource.Id.editText2);
int c2 = Multiply(2, 50);
TV2.Text = c2.ToString();
}
catch (Exception Ex)
{
string msg = Ex.Message;
throw;
}
}
}
}
那么我如何在VS2015格式中从android调用这个类成员呢
------更新SharedObject1类------更新(2)------
Multiply_Obj()和getInstance()的调用者将是什么样子?保持两个文件SharedObject1.h和SharedObject1.cpp与上面相同,并将更新(1)和(2)拉入新项目,然后项目源文件添加include“SharedObject1.h”,这样就可以了
#include "TestMathFuncLib.h"
#include "SharedObject1.h"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "TestMathFuncLib", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "TestMathFuncLib", __VA_ARGS__))
extern "C" {
/* This trivial function returns the platform ABI for which this dynamic native library is compiled.*/
const char * TestMathFuncLib::getPlatformABI()
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
return "This native library is compiled with ABI: %s" ABI ".";
}
void TestMathFuncLib()
{
}
TestMathFuncLib::TestMathFuncLib()
{
}
TestMathFuncLib::~TestMathFuncLib()
{
}
SharedObject1* CreateTestClass()
{
return new SharedObject1();
}
void DisposeTestClass(SharedObject1* pObject)
{
if (pObject != NULL)
{
delete pObject;
pObject = NULL;
}
}
int TestMultiply(SharedObject1* pObject, int a, int b)
{
return pObject->Multiply(a, b);
}
}
现在在android端,只需使用DllImport调用CreateTestClass(),然后将该对象传递到TestMultiply(obj,int,int);它应该可以工作。保持SharedObject1.h和SharedObject1.cpp文件与上面相同,并将更新(1)和(2)拉入新项目,然后项目源文件添加include“SharedObject1.h”,这样就可以了
#include "TestMathFuncLib.h"
#include "SharedObject1.h"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "TestMathFuncLib", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "TestMathFuncLib", __VA_ARGS__))
extern "C" {
/* This trivial function returns the platform ABI for which this dynamic native library is compiled.*/
const char * TestMathFuncLib::getPlatformABI()
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
return "This native library is compiled with ABI: %s" ABI ".";
}
void TestMathFuncLib()
{
}
TestMathFuncLib::TestMathFuncLib()
{
}
TestMathFuncLib::~TestMathFuncLib()
{
}
SharedObject1* CreateTestClass()
{
return new SharedObject1();
}
void DisposeTestClass(SharedObject1* pObject)
{
if (pObject != NULL)
{
delete pObject;
pObject = NULL;
}
}
int TestMultiply(SharedObject1* pObject, int a, int b)
{
return pObject->Multiply(a, b);
}
}
现在在android端,只需使用DllImport调用CreateTestClass(),然后将该对象传递到TestMultiply(obj,int,int);应该有用。你听说过调用约定吗?对调用约定了解一点。不确定跨平台项目使用哪个调用约定。现在我选择最常见的一种。我在上面的SharedObject1类中更新了它。那么我应该在android端键入什么语法呢。谢谢。使用此调用约定的方法调用。。。它需要指向对象本身的指针。。。所以Add应该还有一个参数,首先是IntPtr。。。您应该传递指向SharedObject1实例的指针。。。但是,你应该有一些因子函数来在库中创建它……此外,这种导出的名称不是一个简单的Add。你是说Multiply(),不是Add()函数吗?你听说过调用约定吗?对调用约定知之甚少。不确定跨平台项目使用哪个调用约定。现在我选择最常见的一种。我在上面的SharedObject1类中更新了它。那么我应该在android端键入什么语法呢。谢谢。使用此调用约定的方法调用。。。它需要指向对象本身的指针。。。所以Add应该还有一个参数,首先是IntPtr。。。您应该传递指向SharedObject1实例的指针。。。但是你应该有一些因子函数来在库中创建它……再说,这种导出的名称不是简单的Add,你是说Multiply()而不是Add()函数吗?
#include "TestMathFuncLib.h"
#include "SharedObject1.h"
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "TestMathFuncLib", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "TestMathFuncLib", __VA_ARGS__))
extern "C" {
/* This trivial function returns the platform ABI for which this dynamic native library is compiled.*/
const char * TestMathFuncLib::getPlatformABI()
{
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
#if defined(__ARM_NEON__)
#define ABI "armeabi-v7a/NEON"
#else
#define ABI "armeabi-v7a"
#endif
#else
#define ABI "armeabi"
#endif
#elif defined(__i386__)
#define ABI "x86"
#else
#define ABI "unknown"
#endif
LOGI("This dynamic shared library is compiled with ABI: %s", ABI);
return "This native library is compiled with ABI: %s" ABI ".";
}
void TestMathFuncLib()
{
}
TestMathFuncLib::TestMathFuncLib()
{
}
TestMathFuncLib::~TestMathFuncLib()
{
}
SharedObject1* CreateTestClass()
{
return new SharedObject1();
}
void DisposeTestClass(SharedObject1* pObject)
{
if (pObject != NULL)
{
delete pObject;
pObject = NULL;
}
}
int TestMultiply(SharedObject1* pObject, int a, int b)
{
return pObject->Multiply(a, b);
}
}