Как изменить точку входа Java-программы на сигнатуру C?

Я дурачился с JNA, пытаясь выполнить некоторый код на C в программе Java. Это рабочий пример, который я нашел в сети (JNA требуется в пути сборки):

package core;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class CoreController {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
(Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);

void printf(String format, Object... args);
}

public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i = 0; i < args.length; i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}

Native.main(args);
}
}

На самом деле, я пытаюсь сделать три (казалось бы, повторных) вещи.

1.) Точка входа в программу должна быть изменена на следующую сигнатуру C:

void __stdcall RVExtension(char *output, int outputSize, const char *function);

2.) Java-программа должна быть в состоянии установить output параметр.
3.) Программа должна быть скомпилирована в DLL.

В C ++ эта проблема будет решена следующим образом:

#include "stdafx.h"
extern "C" {
__declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function);
}

void __stdcall RVExtension(char *output, int outputSize, const char *function) {
strncpy_s(output, outputSize, "IT WORKS!", _TRUNCATE);
}

Вопрос в том, возможно ли это как-то с Java? Если так, то я был бы рад увидеть пример кода, так как здесь я нахожусь на многих новых территориях. Я даже не знаю, является ли JNA правильным решением здесь. Если у кого-то есть другая идея, пожалуйста, расскажите!

С уважением,
Джейсон

4

Решение

Вы должны написать обычную C DLL и использовать API вызова Java создать виртуальную машину Java внутри процесса и вызвать вашу Java-программу оттуда. Таким образом, вы можете использовать любую точку входа, которую вы хотите. JNA здесь не помогает.

1

Другие решения


По вопросам рекламы [email protected]