- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图在我的 C++ 语言中模拟这个 (http://snuggletex.sourceforge.net/maven/xref/uk/ac/ed/ph/snuggletex/samples/MinimalExample.html) 代码,以便在本地获得一些 LaTeX 到 MathML 的数学公式转换,但是在最后一次方法调用之后,我的执行被中止
#include <iostream>
#include <string.h>
#include <jni.h>
using namespace std;
#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "snuggletex-1.2.2/snuggletex-core-1.2.2.jar" /* where Prog.class is */
#define SNUGGLE_ENGINE "uk/ac/ed/ph/snuggletex/SnuggleEngine"
#define SNUGGLE_INPUT "uk/ac/ed/ph/snuggletex/SnuggleInput"
#define SNUGGLE_SESSION "uk/ac/ed/ph/snuggletex/SnuggleSession"
#define STRING "java/lang/String"
JNIEnv *env;
JavaVM *jvm;
jint res;
void initJVM() {
#ifdef JNI_VERSION_1_2
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString =
"-Djava.class.path=" USER_CLASSPATH;
vm_args.version = 0x00010002;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_TRUE;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
#else
JDK1_1InitArgs vm_args;
char classpath[1024];
vm_args.version = 0x00010001;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
/* Append USER_CLASSPATH to the default system class path */
sprintf(classpath, "%s%c%s",
vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
vm_args.classpath = classpath;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, &env, &vm_args);
#endif /* JNI_VERSION_1_2 */
}
void closeJVM() {
jvm->DestroyJavaVM();
}
jstring JNU_NewStringNative(const char *str)
{
jstring result;
jbyteArray bytes = 0;
jclass Cstr;
int len;
len = strlen(str);
bytes = (env)->NewByteArray( len);
Cstr = (env)->FindClass(STRING);
if (bytes != NULL) {
jmethodID mid;
(env)->SetByteArrayRegion(bytes, 0, len,(jbyte *)str);
mid = env->GetStaticMethodID(Cstr, "<init>", "([B)V");
result = (jstring) (env)->NewObject(Cstr,mid,bytes);
(env)->DeleteLocalRef(bytes);
return result;
} /* else fall through */
return NULL;
}
int parse_latex(char* input) {
jclass engine, Cinput, Csession;
jmethodID mid;
jstring jstr;
jclass stringClass;
jobjectArray args;
jstring latex = JNU_NewStringNative(input);
jstring result;
engine = env->FindClass(SNUGGLE_ENGINE);
Cinput = env->FindClass(SNUGGLE_INPUT);
Csession = env->FindClass(SNUGGLE_SESSION);
if (engine==NULL) return -1;
mid = env->GetStaticMethodID(engine, "<init>", "()V");
jobject snuggle = env->NewObject(engine, mid);
mid = env->GetStaticMethodID(engine, "createSession", "()V");
jobject session = env->NewObject(engine, mid);
//if (cls==NULL) return -1;
mid = env->GetStaticMethodID(Cinput , "<init>", "(Ljava/lang/String;)V");
jobject input_elem = env->NewObject(Cinput, mid,latex);
mid = env->GetStaticMethodID(Csession , "parseInput", "(Luk/ac/ed/ph/snuggletex/SnuggleInput;)V");
env->CallNonvirtualVoidMethod(session, Csession, mid, input_elem);
printf("obtaining method\n");
mid = env->GetMethodID(Csession , "buildXMLString", "()Ljava/lang/String;");
printf("calling method\n");
try {
result = (jstring)env->CallObjectMethod(session, mid);
printf("ok\n");
} catch (...) {
jthrowable exc;
exc = (env)->ExceptionOccurred();
if (exc) {
env->ExceptionDescribe();
//Returns java.lang.NullPointerException
}
}
return 0;
}
int main() {
int resint;
initJVM();
resint = parse_latex("$$5^2$$");
closeJVM();
return resint;
}
我正在编译:
g++ -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux -L/usr/lib/jvm/java-1.5.0-gcj-4.4/jre/lib/amd64/ -L/usr/lib/jvm/java-1.5.0-gcj-4.4/jre/lib/amd64/client -ljvm -Wl,-rpath,/usr/lib/jvm/java-1.5.0-gcj-4.4/jre/lib/amd64/client -lstdc++ runner.cpp
我哪里错了?提前致谢
编辑
据我所知,env->CallObjectMethod(session, mid);//Aborted
抛出了一个C++异常,尤其是 java.lang.NullPointerException
解决方案
#include <iostream>
#include <string.h>
#include <jni.h>
#include <stdlib.h>
using namespace std;
#define PATH_SEPARATOR ';' /* define it to be ':' on Solaris */
#define USER_CLASSPATH "snuggletex-1.2.2/snuggletex-core-1.2.2.jar" /* where Prog.class is */
#define SNUGGLE_ENGINE "uk/ac/ed/ph/snuggletex/SnuggleEngine"
#define SNUGGLE_INPUT "uk/ac/ed/ph/snuggletex/SnuggleInput"
#define SNUGGLE_SESSION "uk/ac/ed/ph/snuggletex/SnuggleSession"
#define STRING "java/lang/String"
JNIEnv *env;
JavaVM *jvm;
jint res;
void initJVM() {
#ifdef JNI_VERSION_1_2
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString =
"-Djava.class.path=" USER_CLASSPATH;
vm_args.version = 0x00010002;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_TRUE;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
#else
JDK1_1InitArgs vm_args;
char classpath[1024];
vm_args.version = 0x00010001;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
/* Append USER_CLASSPATH to the default system class path */
sprintf(classpath, "%s%c%s",
vm_args.classpath, PATH_SEPARATOR, USER_CLASSPATH);
vm_args.classpath = classpath;
/* Create the Java VM */
res = JNI_CreateJavaVM(&jvm, &env, &vm_args);
#endif /* JNI_VERSION_1_2 */
}
void closeJVM() {
jvm->DestroyJavaVM();
}
jstring JNU_NewStringNative(const char *str)
{
jclass strClass = env->FindClass("java/lang/String");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jstring encoding = env->NewStringUTF("GBK");
jbyteArray bytes = env->NewByteArray(strlen(str));
env->SetByteArrayRegion(bytes, 0, strlen(str), (jbyte*)str);
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
const char * parse_latex(char* input) {
jclass engine, Cinput, Csession;
jmethodID mid;
jstring jstr;
jclass stringClass;
jobjectArray args;
jstring latex = JNU_NewStringNative(input);
jstring result;
engine = env->FindClass(SNUGGLE_ENGINE);
Cinput = env->FindClass(SNUGGLE_INPUT);
Csession = env->FindClass(SNUGGLE_SESSION);
// SnuggleEngine engine = new SnuggleEngine();
mid = env->GetMethodID(engine, "<init>", "()V");
jobject snuggle = env->NewObject(engine, mid);
// SnuggleSession session = engine.createSession();
mid = env->GetMethodID(engine, "createSession", "()L"SNUGGLE_SESSION";");
jobject session = env->CallObjectMethod(snuggle, mid);
// SnuggleInput input = new SnuggleInput("$$ x+2=3 $$");
mid = env->GetMethodID(Cinput , "<init>", "(Ljava/lang/String;)V");
jobject input_elem = env->NewObject(Cinput, mid, latex);
// session.parseInput(input);
mid = env->GetMethodID(Csession , "parseInput", "(L"SNUGGLE_INPUT";)Z");
env->CallBooleanMethod(session, mid, input_elem);
// String xmlString = session.buildXMLString();
mid = env->GetMethodID(Csession , "buildXMLString", "()Ljava/lang/String;");
result = (jstring) env->CallObjectMethod(session, mid);
printf("here\n");
const jbyte *str = (jbyte *)(env)->GetStringUTFChars(result, NULL);
return ((char*)str);
return 0;
}
int main() {
const char* resint;
initJVM();
resint = parse_latex("$$ x+2=3 $$");
if (resint) printf("%s\n", resint); else printf("error\n");
closeJVM();
return (resint!=0);
}
最佳答案
你调用了错误的方法。
// SnuggleEngine engine = new SnuggleEngine();
mid = env->GetMethodID(engine, "<init>", "()V");
jobject snuggle = env->NewObject(engine, mid);
// SnuggleSession session = engine.createSession();
mid = env->GetMethodID(engine, "createSession", "()L"SNUGGLE_SESSION";");
jobject session = env->CallObjectMethod(snuggle, mid);
// SnuggleInput input = new SnuggleInput("$$ x+2=3 $$");
mid = env->GetMethodID(Cinput , "<init>", "(Ljava/lang/String;)V");
jobject input_elem = env->NewObject(Cinput, mid, latex);
// session.parseInput(input);
mid = env->GetMethodID(Csession , "parseInput", "(L"SNUGGLE_INPUT";)Z");
env->CallBooleanMethod(session, mid, input_elem);
// String xmlString = session.buildXMLString();
mid = env->GetMethodID(Csession , "buildXMLString", "()Ljava/lang/String;");
result = (jstring) env->CallObjectMethod(session, mid);
我没有测试它。希望它有效!
关于java - 在 C++ 中从 JNI 调用 Java Jar 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16750317/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!