【发布时间】:2015-02-25 05:40:02
【问题描述】:
我在玩弄 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 是否是一个合适的解决方案。如果有人有其他想法,请告诉!
亲切的问候,
杰森
【问题讨论】:
-
好吧,我想澄清一下:我想将 Java 程序的入口点更改为上面给定的 C 签名,并想从该 Java 程序中创建一个 DLL 文件。可能您将 cpp 程序作为入口点是正确的,但这是一种完全不同的方法,我也需要帮助。
-
AFAIK 无论如何都无法将 Java 本地编译为 DLL。所以我不知道你为什么认为你目前的方法会奏效,但就像女仆一样;我不做Windows。祝你好运!
-
@ElliottFrisch,我读过this,虽然我还没有尝试过,但我相信这种可能性。
-
那个工具是研究级的,它编译成一个.NET DLL。
-
行不通,除非你有某种超级特殊的 Java 设置。 Java 不会“编译”成常规程序。
标签: java c++ c jna entry-point