如何在 Maven 项目中从 C 运行 java 类文件
Posted
技术标签:
【中文标题】如何在 Maven 项目中从 C 运行 java 类文件【英文标题】:How to run java class file from C inside a Maven project 【发布时间】:2012-08-17 23:12:59 【问题描述】:我在 Maven 项目中有一个运行良好的 WebApp(WAR 文件)。
我想从 C 文件调用 maven 项目内的类文件中的 Java 方法。 C 程序读取我的 beagleboard 的 GPIO 输入,当它打开时,它运行 Java 方法。我使用 JNI 来做这件事。
我可以运行经典的 HelloWorld Java 方法,但是当我想从我的 Maven 项目中运行一个方法时,我的 JVM 在尝试加载 Java 静态方法时收到了一个致命错误。
我在 /WEB-INF/myapp/classes/classfile/ 中的 WebApp 中添加了 C 代码
类文件:应用程序 方法:测试
我的 C 程序:
JNIEnv* create_vm(JavaVM ** jvm)
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options;
//Path to the java source code
options.optionString = "-Djava.class.path=./";
//JDK version. This indicates version 1.6
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = &options;
vm_args.ignoreUnrecognized = 0;
int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(ret < 0)
printf("\nUnable to Launch JVM\n");
return env;
int main(int argc, char** argv)
int fd, ret, data[64];
JNIEnv *env;
JavaVM * jvm;
env = create_vm(&jvm);
if (env == NULL)
return 1;
fd = ret = open(argv[argc - 1], O_RDONLY);
printf("open returned %d\n", ret);
while (1)
ret = read(fd, &data, sizeof(data));
printf("read returned %d\n", ret);
jclass helloWorldClass = (*env)->FindClass(env, "App");
printf("appel class\n");
jmethodID mainMethod = (*env)->GetStaticMethodID(
env, helloWorldClass, "test", "([Ljava/lang/String;)V");
printf("appel method\n");
(*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, NULL);
sleep(2);
(*jvm)->DestroyJavaVM(jvm);
exit(0);
Java 类:
package App;
public class App
public static void test (String[] args)
System.out.println("Hello World");
【问题讨论】:
+1 用于 beagleboard - 你应该添加那个标签,顺便说一句。 【参考方案1】:你用Reverse JNI调查过吗?
我注意到您有以下行:
options.optionString = "-Djava.class.path=./"; //Path to the java source code
类路径需要指向 Maven 生成的 jar 文件,或者你的 Java 类文件所在的根目录。
见:Setting the ClassPath,
在标准的 Maven 项目中,当您执行 mvn package
时,Maven 将在 target/
下创建您的 jar。所以你可能会将-Djava.class.path=./
更改为-cp /target/App.jar
【讨论】:
我使用的是反向 JNI。但我无法运行 Maven 项目中的 java 应用程序:/以上是关于如何在 Maven 项目中从 C 运行 java 类文件的主要内容,如果未能解决你的问题,请参考以下文章
在 Maven 中从测试范围运行 main:“目标 org.codehaus.mojo:exec-maven-plugin:1.6.0:java 的参数 'mainClass' 丢失或无效”