VS2015跨平台Android和C++;

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

我正在使用Visual Studio 2015进行跨平台开发。我有现有的C++项目,希望Android端能调用它。我读过关于JNI的文章,但我使用VS2015

<>我可以调用C++非成员函数,但是我如何调用SyrdObjist.1.H.file中的函数(如以下函数乘法)
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);
    }
}