gpt4 book ai didi

java - 运行一段存储在 Java 字符串中的 C 代码

转载 作者:行者123 更新时间:2023-11-30 06:46:14 25 4
gpt4 key购买 nike

我这里有一个相当有趣的场景。假设我有一段 C 代码存储在 Java 字符串中。我需要在我的 Java 程序中自行运行这段代码。

案例一

class Main{
public static void main(String[] args) {
String cCode = "printf(\"Hello World\n\");"
// I need to run the cCode here.
// We are allowed to call a method with params.
}
}

我认为我应该做的是。

  1. 在 Main 中创建一个本地字段
  2. 将sCode写入文件
  3. 从 Java 执行 shell 命令来编译 c 代码。
  4. 从java中调用本地方法

案例二

我正在考虑执行上述过程,因为如果源代码是预定义的,我知道如何使用 JNI 执行此操作。

 class Main{

static {
System.loadLibrary("Main"); // Load native library at runtime
}

private native void sayHello();

public static void main(String[] args) {
new Main().sayHello();
}

}

在预先编写的 C 代码的情况下。我们所做的是。

  1. javac Main.java编译java类
  2. 为 C 库生成 header 。 javah -jni Main
  3. 通过编写C代码完成Main.c
  4. 使用 gcc -share -I/path/to/jni -I/path/to/jni_md -o Main.so 编译 C 代码
  5. 运行主程序。 java 主程序

谁能告诉我我走的路是否正确(在情况 1 中)?或者有更好的方法吗?

** 注意:这里的重点是,我只能编译一次java代码。 (一开始)。**

编辑:在查看@Dúthomhas 的评论和回答后,我想我应该再解释一件事。我之所以这样做是为了一个机器学习项目。已经确定数值计算部分存在瓶颈,使用 C 作为上述方法值得冒险尝试。因此,安全性现在不在考虑之列。我们只需要将其作为实验进行即可。

最佳答案

非答案答案:不要那样做。

出于多种原因,您要求做的是一个非常糟糕的主意,其中两个主要原因是:

  • 它可能会打开(严重的)安全漏洞
  • 实现成本可能超过 yield

要求嵌入一种完全不同的语言意味着添加和链接一个库和大量代码来同步库,再加上执行静态分析和沙盒代码的代码。换句话说,您要求在现有语言的基础上实现一门完整的语言。

可以争辩说 C 无论如何都是基本系统,甚至可以在其上实现 JVM(通常是),但这不是重点。问题不在于 C 库,而是 C 编译器/解释器,就简单的解释型编程语言而言,这是一个相当复杂的代码库。

建议:使用Java

ToolProvider 类是专门为您提供 Java 代码的动态编译而设计的。看看它。

确保使用 SecurityManager 类对代码进行适当的沙盒处理。 (并且,如果可能,在一个单独的、受限的 JVM 中运行它。)

建议:使用JavaScript/ECMAScript

ScriptEngine 类正是为此而设计的。同样,Google 周围的例子。再次重申,不要忘记安全性。

建议:使用现有的库

但我真的想/必须使用C

唉。 可以使用 C,但难度很大。 Google 围绕“嵌入式 C 解释器”搜索小型 C 解释器,您可能能够将其集成到您的源代码中。 (不过,祝你好运!)

关于java - 运行一段存储在 Java 字符串中的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47842815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com