如何将Java程序的入口点更改为C签名?

时间:2014-12-29 00:29:16

标签: java c++ c jna entry-point

我在JNA试图在Java程序中执行某些C代码时感到愚蠢。这是我在网上找到的一个工作示例(构建路径中需要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在这里是否是一个合适的解决方案。如果有人有其他想法,请告诉我们!

亲切的问候,
杰森

1 个答案:

答案 0 :(得分:1)

您必须编写常规C DLL并使用Java Invocation API在进程内创建Java VM并从那里调用Java程序。这样你就可以使用你想要的任何入口点。 JNA在这里没有帮助。