Я дурачился с 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 правильным решением здесь. Если у кого-то есть другая идея, пожалуйста, сообщите!
С уважением,
jaySon
char*
. - person Hot Licks   schedule 29.12.2014public static void main(String[] args)
не является точкой входа, но что касаетсяchar*
, то я играл с JNA, надеясь найти решение этой проблемы. - person jaySon   schedule 29.12.2014main
в классе нет абсолютно ничего особенного, кроме его имени. - person Hot Licks   schedule 29.12.2014