Skip to content

Commit 6bc416e

Browse files
Woodrow Barlowtresf
authored andcommitted
Add MSVC Support
- Removes variable length arrays - Adds static linking, disable optimization - Ensure Java is found by cmake Closes #2
1 parent 7c59239 commit 6bc416e

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

CMakeLists.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
cmake_minimum_required(VERSION 3.9)
22
project(jssc VERSION 2.8.0 DESCRIPTION "Java Simple Serial Connector")
33

4+
find_package(Java)
45
find_package(JNI)
56

67
# Kitware-recommended technique for defaulting to 'Release' mode
@@ -37,12 +38,18 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
3738
find_package(JNI)
3839
endif()
3940
endif()
41+
elseif(MSVC)
42+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
4043
endif()
4144

4245
if(WIN32)
4346
set(JSSC_PLATFORM "windows")
4447
# Disable optimization for Release builds (XP/Server 2003)
45-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O0")
48+
if(NOT MSVC)
49+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O0")
50+
else()
51+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Od")
52+
endif()
4653
else()
4754
set(JSSC_PLATFORM "_nix_based")
4855
# Sane level of optimization for Release builds

src/cpp/windows/jssc.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929

3030
//#include <iostream>
3131

32+
#define MAX_PORT_NAME_STR_LEN 32
33+
3234
/*
3335
* Get native library version
3436
*/
@@ -46,7 +48,12 @@ JNIEXPORT jlong JNICALL Java_jssc_SerialNativeInterface_openPort(JNIEnv *env, jo
4648
const char* port = env->GetStringUTFChars(portName, JNI_FALSE);
4749

4850
//since 2.1.0 -> string concat fix
49-
char portFullName[strlen(prefix) + strlen(port) + 1];
51+
char portFullName[MAX_PORT_NAME_STR_LEN];
52+
53+
if(strlen(prefix) + strlen(port) + 1 > sizeof(portFullName)){
54+
return (jlong)((HANDLE)jssc_SerialNativeInterface_ERR_PORT_NOT_FOUND);
55+
}
56+
5057
strcpy(portFullName, prefix);
5158
strcat(portFullName, port);
5259
//<- since 2.1.0
@@ -259,8 +266,15 @@ JNIEXPORT jbyteArray JNICALL Java_jssc_SerialNativeInterface_readBytes
259266
DWORD lpNumberOfBytesTransferred;
260267
DWORD lpNumberOfBytesRead;
261268
OVERLAPPED *overlapped = new OVERLAPPED();
262-
jbyte lpBuffer[byteCount];
269+
jbyte *lpBuffer = NULL;
263270
jbyteArray returnArray = env->NewByteArray(byteCount);
271+
272+
lpBuffer = (jbyte *)malloc(byteCount * sizeof(jbyte));
273+
if(lpBuffer == NULL){
274+
// return an empty array
275+
return returnArray;
276+
}
277+
264278
overlapped->hEvent = CreateEventA(NULL, true, false, NULL);
265279
if(ReadFile(hComm, lpBuffer, (DWORD)byteCount, &lpNumberOfBytesRead, overlapped)){
266280
env->SetByteArrayRegion(returnArray, 0, byteCount, lpBuffer);
@@ -274,6 +288,7 @@ JNIEXPORT jbyteArray JNICALL Java_jssc_SerialNativeInterface_readBytes
274288
}
275289
CloseHandle(overlapped->hEvent);
276290
delete overlapped;
291+
free(lpBuffer);
277292
return returnArray;
278293
}
279294

0 commit comments

Comments
 (0)