如何在 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' 丢失或无效”

在 Netbeans 中从 ant 迁移到 maven

如何在我的项目中从 npm 切换到 yarn?

Eclipse中从svn中检出maven项目

如何在 IDE 之外运行/执行 java 代码(maven 项目)

在 Jenkins 中从 Maven POM 获取项目版本