Для работы с Java из C++ необходимо использовать Java Native Interface (JNI). А для этого необходимо включить jni.h в код проекта: #include <jni.h>. Так же необходимо указать путь к библиотеке libjvm.

В системах семейства Linux эта библиотека находится тут /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so.

Пути до include директории и до библиотеки libjvm можно указать в конфиге CMakeLists.txt. Либо можно воспользоваться модулем CMake - FindJNI: find_package(JNI).

Приложение C++

В примере кода ниже вы можете посмотреть как это сделано:

cmake_minimum_required(VERSION 3.9)
project(cpp)

find_package(JNI REQUIRED)

include_directories(${JNI_INCLUDE_DIRS})

set(CMAKE_CXX_STANDARD 11)

add_executable(cpp main.cpp)

target_link_libraries(cpp ${JNI_LIBRARIES})

После этого можно написать простую программу, которая будет вызывать метод Java из кода С++.

#include <iostream>
#include <jni.h>

int main(int argc, char *argv[]) {
    JavaVM *javaVM;
    JNIEnv *jniEnv;
    JavaVMInitArgs javaArgs;
    JavaVMOption options[1];
    options[0].optionString = "-Djava.class.path=/home/idurdyev/CLionProjects/CPP_JNI/target/jnitest-1.0-SNAPSHOT.jar";

    javaArgs.version = JNI_VERSION_1_6; //JDK version. This indicates version 1.6
    javaArgs.nOptions = 1;
    javaArgs.options = options;
    javaArgs.ignoreUnrecognized = 0;

    JNI_GetDefaultJavaVMInitArgs(&javaArgs);
    JNI_CreateJavaVM(&javaVM, (void **) &jniEnv, &javaArgs);

    jclass cls = jniEnv->FindClass("com/idurdyev/cpp/jni/jnitest/Main");
    jmethodID mid = jniEnv->GetStaticMethodID(cls, "helloFromJava", "()Ljava/lang/String;");
    jobject o = jniEnv->CallStaticObjectMethod(cls, mid);
    jstring str = static_cast<jstring>(o);

    std::cout << jniEnv->GetStringUTFChars(str, 0) << std::endl;

    return 0;
}

Чтобы узнать список всех функций в виде строки, в классе Java, нужно воспользоваться утилитой javap

javap -cp jnitest-1.0-SNAPSHOT.jar -s -p com/idurdyev/cpp/jni/jnitest/Main

-cp - classpath, путь до классов Java или jar файла

Путь до класса здесь снова нужно указать через обратный слэш.

Приложение Java

Пример код ниже - самое простое приложение с одной функцией helloFromJava для тестирования взаимодействия через JNI.

package com.idurdyev.cpp.jni.jnitest;

public class Main {
    public static String helloFromJava() {
        return "Hello, from Java";
    }
}

Исходники проектов как всегда на GitHub. Удачи!