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

标签 java c java-native-interface

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

案例1

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调用本地方法

案例2

我正在考虑执行上述过程,因为如果源代码是预定义的,我知道如何使用 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 库的头文件。 javah -jni 主要
  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 类正是为此而设计的。再次,谷歌周围的例子。再次强调,不要忘记安全性。

建议:使用现有库

但我真的想要/必须使用 C

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

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

相关文章:

java - 有时会收到 java.util.ConcurrentModificationException,有时则不会。不明白为什么

Java程序需要根证书吗?

java - 半唯一嵌套 Java 映射?

linux - 使用 fts(3) 函数重命名文件和目录。仅第一级发生变化

c - .c语言中的jstring比较该怎么办

java - 具有多个参数的 K-means 算法

二进制值的 C 数组

c - 变量赋值是语句还是表达式?

android - Make.exe 访问被拒绝

java - 如何通过 JNI 设置 Java 类的 Double/Integer 类型的值