首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在android上统一运行共享内存?

如何在android上统一运行共享内存?
EN

Stack Overflow用户
提问于 2019-09-02 22:57:57
回答 1查看 279关注 0票数 0

我为一台每秒更新x,y,z位置200次的设备编写了一个usb驱动程序,我不喜欢调用某些函数来每秒200次地获取新值,从而更新共享内存位置上的值。是否可以将IntPtr传递给AndroidJavaObject.call方法并使用该方法访问共享内存,或者反过来?或者有不同的方法来解决这个问题呢?发布我的代码是没有意义的,因为没有关于共享内存的内容。

在unity C#方面:

代码语言:javascript
复制
        AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");


        float[] res = new float[7];
        IntPtr ptr = Marshal.AllocHGlobal(res.Length * sizeof(float));

        var ajc = new AndroidJavaObject("com.example.t265lib.USBController", unityContext, 256, ptr, null);

在Java方面,它只是一个构造函数:

代码语言:javascript
复制
    public USBController(Context context, int chunkSize, int ptr,TextView deb) {
        if (deb != null) debugging = deb;
        if (chunkSize != 0) CHUNK_SIZE = chunkSize;
        msg = new byte[9];
        msgResponse = new byte[8];
        resPtr = new float[7];
        this.context = context;
        usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
    }
EN

回答 1

Stack Overflow用户

发布于 2019-09-03 16:31:56

你可以将你在Android-Plugin中的位置保存到一个变量中。然后根据您的意愿从Unity中轮询它(例如,在Update循环中)。

安卓

代码语言:javascript
复制
// inner class for position values
public class PositionData {
    public int x;
    public int y;
    public int z;
}

// access data from unity
public PositionData getCurrentPosition() { 
    // TODO: make thread-safe
    return mCurrentPosition;
}

统一

代码语言:javascript
复制
// class for position values
public class PositionData
{
    public int X;
    public int Y;
    public int Z;
}

// poll position from Android (usbController is initialised somewhere else)
public PositionData ReadPositionData()
{
    var data = usbController.Call<AndroidJavaObject>("getCurrentPosition");

    if (data == null)
    {
        Debug.LogError("Could not retrieve data from Android.");
        return null;
    }

    var positionData = new PositionData
    {
        X = data.Get<int>("x"),
        Y = data.Get<int>("y"),
        Z = data.Get<int>("z")
    };

    return positionData;
}

USB-Communication应该在它自己的线程中,并且对它的值的访问必须是线程安全的(Unity在主线程上运行)。

你也可以在Android中实现一些过滤来平滑你的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57759092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档