2014-12-29 3 views
4

Я обманывал JNA, пытаясь выполнить код C в программе Java. Это рабочий пример, который я нашел в Интернете (ЮНА требуется в пути сборки):Как изменить точку входа Java-программы на C-подпись?

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); 
    } 
} 

На самом деле, я пытаюсь сделать три (по-видимому rediculess) вещи.

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 здесь. Если у кого есть другая идея, скажите!

С наилучшими пожеланиями,
Джейсоном

+0

Ну, я попробую уточнить: я хотел бы изменить точку входа программы Java на вышеуказанную C-подпись и хотел бы создать DLL-файл из этой Java-программы. Возможно, вы правы в том, чтобы сделать программу cpp точкой входа, но это совершенно другой подход, и мне тоже нужна помощь. – jaySon

+1

AFAIK не может изначально скомпилировать Java в DLL. Поэтому я понятия не имею, почему вы думаете, что ваш нынешний подход будет работать, но, как и горничная; Я не делаю Windows. Удачи! –

+0

@ ElliottFrisch, я прочитал [это] (http://stackoverflow.com/questions/262603/is-there-any-way-to-compile-java-code-into-a-dll), и хотя Я еще не пробовал, я доверяю этой возможности. – jaySon

ответ

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^