我可以从c++中调用clojure代码吗?
Can I call clojure code from C++?
我正在为一个用c++编写的程序编写一个插件。
插件被放置在一个特定的目录中,由主应用程序调用。我想在Clojure (gui,计算等)中编写大部分插件,但实际的"插件"需要用c++编写。各种数据需要从c++传递到Clojure。
我该怎么做?
JNI/JNA, socket,系统调用?
我知道这个问题很老了,但也许有人会觉得这个问题很有用。
#include <jni.h> /* where everything is defined */
#include <cstring>
int main() {
JavaVM *jvm; /* denotes a Java VM */
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1];
options[0].optionString = "-Djava.class.path=/home/raoof/.m2/repository/org/clojure/spec.alpha/0.1.143/spec.alpha-0.1.143.jar:/home/raoof/.m2/repository/org/clojure/clojure/1.9.0/clojure-1.9.0.jar";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface
* pointer in env */
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
delete options;
jclass Clojure = env->FindClass("clojure/java/api/Clojure");
jmethodID var = env->GetStaticMethodID(Clojure, "var", "(Ljava/lang/Object;Ljava/lang/Object;)Lclojure/lang/IFn;");
jobject load_string = env->CallStaticObjectMethod(Clojure, var, env->NewStringUTF("clojure.core"), env->NewStringUTF("load-string"));
jmethodID load_string_invoke = env->GetMethodID(env->GetObjectClass(load_string), "invoke", "(Ljava/lang/Object;)Ljava/lang/Object;");
env->CallObjectMethod(load_string, load_string_invoke, env->NewStringUTF("(prn (+ 1 2 3 4 5))"));
jvm->DestroyJavaVM();
}
和
g++ -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux/ -L/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server -ljvm clojurejvm.cpp
LD_LIBRARY_PATH=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server ./a.out
JNI应该非常简单。
我将这样处理它:
- 使用定义良好的外部接口开发clojure代码;也就是说,你需要调用的任何一组方法/函数。
- 将它打包成一个独立的超级jar包(包含clojure库))
- 编写c++包装器,它必须完成以下操作:
- 用你的uberjar在类路径上创建jvm(参见这个链接:http://java.sun.com/docs/books/jni/html/invoke.html)加载clojure类
- 提供一个facade,将c++函数映射到底层java方法(clojure函数)
你可以通过一个简单的独立java测试工具来测试第2步中的ber-jar,它创建了主clojure类并调用了适当的方法;这将让您知道您有一个好的java/clojure jar,以防您在第3步的jni调用中遇到任何问题。
当您检查jni引用时,请特别注意c和c++ jni链接之间细微的调用差异。
好运。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 我可以从c++中调用clojure代码吗?