我为一台每秒更新x,y,z位置200次的设备编写了一个usb驱动程序,我不喜欢调用某些函数来每秒200次地获取新值,从而更新共享内存位置上的值。是否可以将IntPtr传递给AndroidJavaObject.call方法并使用该方法访问共享内存,或者反过来?或者有不同的方法来解决这个问题呢?发布我的代码是没有意义的,因为没有关于共享内存的内容。
在unity C#方面:
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方面,它只是一个构造函数:
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);
}发布于 2019-09-03 16:31:56
你可以将你在Android-Plugin中的位置保存到一个变量中。然后根据您的意愿从Unity中轮询它(例如,在Update循环中)。
安卓
// 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;
}统一
// 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中实现一些过滤来平滑你的值。
https://stackoverflow.com/questions/57759092
复制相似问题