Как изменить точку входа программы 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 правильным решением здесь. Если у кого-то есть другая идея, пожалуйста, сообщите!

С уважением,
jaySon


person jaySon    schedule 29.12.2014    source источник
comment
Что ж, я попытаюсь уточнить: я хотел бы изменить точку входа программы Java на приведенную выше подпись C и хотел бы создать файл DLL из этой программы Java. Вероятно, вы правы в том, что делаете программу cpp точкой входа, но это совершенно другой подход, и здесь мне тоже понадобится помощь.   -  person jaySon    schedule 29.12.2014
comment
AFAIK все равно не может компилировать Java в DLL. Так что я понятия не имею, почему вы думаете, что ваш нынешний подход сработает, но как горничная; Я не делаю винду. Удачи!   -  person Elliott Frisch    schedule 29.12.2014
comment
@ElliottFrisch, я прочитал это, и хотя я еще не пробовал, я верю в возможность.   -  person jaySon    schedule 29.12.2014
comment
Этот инструмент исследовательского класса, и он компилируется в .NET DLL.   -  person Elliott Frisch    schedule 29.12.2014
comment
Не сработает, если у вас нет какой-то супер-специальной установки Java. Java не компилируется в обычную программу.   -  person Hot Licks    schedule 29.12.2014
comment
@HotLicks, я знаю это. Вот почему я связал этот вопрос IKVM, а также поэтому я сделал весь этот вопрос таким расплывчатым, поскольку сам очень сомневаюсь, что это вообще возможно. Но я надеялся/надеюсь, что это будет возможно, поскольку лично я предпочитаю язык программирования Java.   -  person jaySon    schedule 29.12.2014
comment
Ну, нет смысла говорить, что точка входа в программу должна быть изменена... поскольку у Java-программы нет точки входа. И даже если бы это было так, Java понятия не имеет, что такое параметр char*.   -  person Hot Licks    schedule 29.12.2014
comment
Я не понимаю, почему public static void main(String[] args) не является точкой входа, но что касается char*, то я играл с JNA, надеясь найти решение этой проблемы.   -  person jaySon    schedule 29.12.2014
comment
В методе main в классе нет абсолютно ничего особенного, кроме его имени.   -  person Hot Licks    schedule 29.12.2014


Ответы (1)


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

person user2543253    schedule 02.02.2015