JVMTI – Get System Properties

In this post we will see how we can use the JVMTI GetSystemProperties to get a list of system properties.

```cpp{numberLines: true}

#include "jvmti.h"

#include

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM jvm, char options, void reserved) { std::cout << "JVMTIGetSystemProperties :: Agent Initiated!!"; jvmtiEnv jvmti; jvmtiError error; jint result; jint count = 0; char **props;

result = jvm->GetEnv((void **) &jvmti, JVMTI_VERSION_1_2);

if (result != JNI_OK) {
    std::cerr << "Unable to access JVMTI!!!";
}

error = jvmti->GetSystemProperties(&count, &props);
if (error != JVMTI_ERROR_NONE) return JNI_FALSE;

std::cout << "JVMTI Agent (System Property) \n";
for (int i = 0; i < count; i++) {
    char *value;
    error = jvmti->GetSystemProperty(props[i], &value);
    if (error != JVMTI_ERROR_NONE) return JNI_FALSE;
    std::cout << props[i] << " = " << value << "\n";
}
return JNI_OK;

}



CMake

```{numberLines: true}
cmake_minimum_required(VERSION 3.13)
project(JVMTIGetSystemProperties)

set(CMAKE_CXX_STANDARD 11)

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    # using Clang
    message("Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    # using GCC
    message("GCC")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
    # using Intel C++
    message("IntelC++")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    # using Visual Studio C++
    message("Visual Studio C++")
endif ()


# Compiler and Linker flags
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_COLOR_MAKEFILE ON)
#set(CMAKE_VERBOSE_MAKEFILE ON)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
set(CMAKE_CXX_FLAGS_VALGRIND "-fno-inline")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_VALGRIND} -Werror -Wno-missing-field-initializers -Wmissing-braces")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O4 -DNDEBUG")


find_package(JNI)

if (JNI_FOUND)
    message(STATUS "JNI_INCLUDE_DIRS=${JNI_INCLUDE_DIRS}")
    message(STATUS "JNI_LIBRARIES=${JNI_LIBRARIES}")
endif ()
# Compiler and Linker flags

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_COLOR_MAKEFILE ON)
#set(CMAKE_VERBOSE_MAKEFILE ON)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")
set(CMAKE_CXX_FLAGS_VALGRIND "-fno-inline")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_VALGRIND} -Werror -Wno-missing-field-initializers -Wmissing-braces")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O4 -DNDEBUG")

find_package(JNI)

if (JNI_FOUND)
    message(STATUS "JNI_INCLUDE_DIRS=${JNI_INCLUDE_DIRS}")
    message(STATUS "JNI_LIBRARIES=${JNI_LIBRARIES}")
endif ()

set(HEADER_BASE "${CMAKE_CURRENT_SOURCE_DIR}/include")
include_directories(${JNI_INCLUDE_DIRS})
include_directories(${HEADER_BASE})

set(SOURCE_FILES library.cpp ${HEADER_BASE})

add_library(JVMTIGetSystemProps SHARED ${SOURCE_FILES})

Build the code and add the library to a running JVM using the agentlib config parameter.

Full source code available at github.com/sachin-handiekar/jvmti-examples

Did you find this article valuable?

Support Sachin Handiekar by becoming a sponsor. Any amount is appreciated!