diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java index 41d4213769..b4446944e5 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/SerialPort.java @@ -8,7 +8,6 @@ package edu.wpi.first.wpilibj; import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; import edu.wpi.first.wpilibj.hal.FRCNetComm.tResourceType; import edu.wpi.first.wpilibj.hal.HAL; @@ -252,10 +251,13 @@ public class SerialPort { * @return An array of the read bytes */ public byte[] read(final int count) { - ByteBuffer dataReceivedBuffer = ByteBuffer.allocateDirect(count); + byte[] dataReceivedBuffer = new byte[count]; int gotten = SerialPortJNI.serialRead(m_port, dataReceivedBuffer, count); + if (gotten == count) { + return dataReceivedBuffer; + } byte[] retVal = new byte[gotten]; - dataReceivedBuffer.get(retVal); + System.arraycopy(dataReceivedBuffer, 0, retVal, 0, gotten); return retVal; } @@ -267,9 +269,10 @@ public class SerialPort { * @return The number of bytes actually written into the port. */ public int write(byte[] buffer, int count) { - ByteBuffer dataToSendBuffer = ByteBuffer.allocateDirect(count); - dataToSendBuffer.put(buffer, 0, count); - return SerialPortJNI.serialWrite(m_port, dataToSendBuffer, count); + if (buffer.length < count) { + throw new IllegalArgumentException("buffer is too small, must be at least " + count); + } + return SerialPortJNI.serialWrite(m_port, buffer, count); } /** diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/OSSerialPortJNI.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/OSSerialPortJNI.java index 313fa76372..45f643a0b1 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/OSSerialPortJNI.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/OSSerialPortJNI.java @@ -7,8 +7,6 @@ package edu.wpi.first.wpilibj.hal; -import java.nio.ByteBuffer; - public class OSSerialPortJNI extends JNIWrapper { public static native void serialInitializePort(byte port); @@ -36,9 +34,9 @@ public class OSSerialPortJNI extends JNIWrapper { public static native int serialGetBytesReceived(byte port); - public static native int serialRead(byte port, ByteBuffer buffer, int count); + public static native int serialRead(byte port, byte[] buffer, int count); - public static native int serialWrite(byte port, ByteBuffer buffer, int count); + public static native int serialWrite(byte port, byte[] buffer, int count); public static native void serialFlush(byte port); diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java index 08f5b6bd50..50011761dc 100644 --- a/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/hal/SerialPortJNI.java @@ -7,8 +7,6 @@ package edu.wpi.first.wpilibj.hal; -import java.nio.ByteBuffer; - public class SerialPortJNI extends JNIWrapper { public static native void serialInitializePort(byte port); @@ -36,9 +34,9 @@ public class SerialPortJNI extends JNIWrapper { public static native int serialGetBytesReceived(byte port); - public static native int serialRead(byte port, ByteBuffer buffer, int count); + public static native int serialRead(byte port, byte[] buffer, int count); - public static native int serialWrite(byte port, ByteBuffer buffer, int count); + public static native int serialWrite(byte port, byte[] buffer, int count); public static native void serialFlush(byte port); diff --git a/wpilibj/src/main/native/cpp/OSSerialPortJNI.cpp b/wpilibj/src/main/native/cpp/OSSerialPortJNI.cpp index 5333017e2e..375e5bceb0 100644 --- a/wpilibj/src/main/native/cpp/OSSerialPortJNI.cpp +++ b/wpilibj/src/main/native/cpp/OSSerialPortJNI.cpp @@ -13,8 +13,10 @@ #include "HAL/OSSerialPort.h" #include "HALUtil.h" +#include "support/jni_util.h" using namespace frc; +using namespace wpi::java; // set the logging level TLogLevel osserialJNILogLevel = logWARNING; @@ -237,16 +239,18 @@ Java_edu_wpi_first_wpilibj_hal_OSSerialPortJNI_serialGetBytesReceived( /* * Class: edu_wpi_first_wpilibj_hal_OSSerialPortJNI * Method: serialRead - * Signature: (BLjava/nio/ByteBuffer;I)I + * Signature: (B[BI)I */ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_OSSerialPortJNI_serialRead( - JNIEnv* env, jclass, jbyte port, jobject dataReceived, jint size) { + JNIEnv* env, jclass, jbyte port, jbyteArray dataReceived, jint size) { SERIALJNI_LOG(logDEBUG) << "Serial Read"; - jbyte* dataReceivedPtr = nullptr; - dataReceivedPtr = (jbyte*)env->GetDirectBufferAddress(dataReceived); + llvm::SmallVector recvBuf; + recvBuf.resize(size); int32_t status = 0; - jint retVal = HAL_ReadOSSerial(static_cast(port), reinterpret_cast(dataReceivedPtr), + jint retVal = HAL_ReadOSSerial(static_cast(port), recvBuf.data(), size, &status); + env->SetByteArrayRegion(dataReceived, 0, size, + reinterpret_cast(recvBuf.data())); SERIALJNI_LOG(logDEBUG) << "ReturnValue = " << retVal; SERIALJNI_LOG(logDEBUG) << "Status = " << status; CheckStatus(env, status); @@ -256,18 +260,17 @@ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_OSSerialPortJNI_serialRead /* * Class: edu_wpi_first_wpilibj_hal_OSSerialPortJNI * Method: serialWrite - * Signature: (BLjava/nio/ByteBuffer;I)I + * Signature: (B[BI)I */ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_OSSerialPortJNI_serialWrite( - JNIEnv* env, jclass, jbyte port, jobject dataToSend, jint size) { + JNIEnv* env, jclass, jbyte port, jbyteArray dataToSend, jint size) { SERIALJNI_LOG(logDEBUG) << "Serial Write"; - jbyte* dataToSendPtr = nullptr; - if (dataToSend != 0) { - dataToSendPtr = (jbyte*)env->GetDirectBufferAddress(dataToSend); - } int32_t status = 0; - jint retVal = HAL_WriteOSSerial(static_cast(port), reinterpret_cast(dataToSendPtr), - size, &status); + jint retVal = + HAL_WriteOSSerial(static_cast(port), + reinterpret_cast( + JByteArrayRef(env, dataToSend).array().data()), + size, &status); SERIALJNI_LOG(logDEBUG) << "ReturnValue = " << retVal; SERIALJNI_LOG(logDEBUG) << "Status = " << status; CheckStatus(env, status); diff --git a/wpilibj/src/main/native/cpp/SerialPortJNI.cpp b/wpilibj/src/main/native/cpp/SerialPortJNI.cpp index 20525c0640..2d72505769 100644 --- a/wpilibj/src/main/native/cpp/SerialPortJNI.cpp +++ b/wpilibj/src/main/native/cpp/SerialPortJNI.cpp @@ -13,8 +13,10 @@ #include "HAL/SerialPort.h" #include "HALUtil.h" +#include "support/jni_util.h" using namespace frc; +using namespace wpi::java; // set the logging level TLogLevel serialJNILogLevel = logWARNING; @@ -237,16 +239,18 @@ Java_edu_wpi_first_wpilibj_hal_SerialPortJNI_serialGetBytesReceived( /* * Class: edu_wpi_first_wpilibj_hal_SerialPortJNI * Method: serialRead - * Signature: (BLjava/nio/ByteBuffer;I)I + * Signature: (B[BI)I */ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_SerialPortJNI_serialRead( - JNIEnv* env, jclass, jbyte port, jobject dataReceived, jint size) { + JNIEnv* env, jclass, jbyte port, jbyteArray dataReceived, jint size) { SERIALJNI_LOG(logDEBUG) << "Serial Read"; - jbyte* dataReceivedPtr = nullptr; - dataReceivedPtr = (jbyte*)env->GetDirectBufferAddress(dataReceived); + llvm::SmallVector recvBuf; + recvBuf.resize(size); int32_t status = 0; - jint retVal = HAL_ReadSerial(static_cast(port), reinterpret_cast(dataReceivedPtr), + jint retVal = HAL_ReadSerial(static_cast(port), recvBuf.data(), size, &status); + env->SetByteArrayRegion(dataReceived, 0, size, + reinterpret_cast(recvBuf.data())); SERIALJNI_LOG(logDEBUG) << "ReturnValue = " << retVal; SERIALJNI_LOG(logDEBUG) << "Status = " << status; CheckStatus(env, status); @@ -256,18 +260,17 @@ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_SerialPortJNI_serialRead( /* * Class: edu_wpi_first_wpilibj_hal_SerialPortJNI * Method: serialWrite - * Signature: (BLjava/nio/ByteBuffer;I)I + * Signature: (B[BI)I */ JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_SerialPortJNI_serialWrite( - JNIEnv* env, jclass, jbyte port, jobject dataToSend, jint size) { + JNIEnv* env, jclass, jbyte port, jbyteArray dataToSend, jint size) { SERIALJNI_LOG(logDEBUG) << "Serial Write"; - jbyte* dataToSendPtr = nullptr; - if (dataToSend != 0) { - dataToSendPtr = (jbyte*)env->GetDirectBufferAddress(dataToSend); - } int32_t status = 0; - jint retVal = HAL_WriteSerial(static_cast(port), reinterpret_cast(dataToSendPtr), - size, &status); + jint retVal = + HAL_WriteSerial(static_cast(port), + reinterpret_cast( + JByteArrayRef(env, dataToSend).array().data()), + size, &status); SERIALJNI_LOG(logDEBUG) << "ReturnValue = " << retVal; SERIALJNI_LOG(logDEBUG) << "Status = " << status; CheckStatus(env, status);