【问题标题】:how to run a c program using a java program using JNI如何使用 JNI 使用 java 程序运行 c 程序
【发布时间】:2015-03-17 14:01:58
【问题描述】:

我浏览了整个互联网,现在我一直在生成共享库。 第一个 Java 文件:

import java.io.*;
public class JavaToC {

public native void helloC();

static {
    System.loadLibrary("HelloWorld");
}

public static void main(String[] args) {
    new JavaToC().helloC();
}}

在编译完上面的java程序后,我还使用了头文件:

javah JavaToC

现在我编写了我的简单 C 程序:(HelloWorld.c)

#include <stdio.h>
#include <stdlib.h>
#include <JavaToC.h>
#include <jni.h>

JNIEXPORT void JNICALL Java_JavaToC_helloC(JNIEnv *env, jobject javaobj) 
{
printf("Hello World: From C");
return;
}

现在我想创建一个本地共享库,但在这里我卡住了,我使用了

gcc HelloWorld.C -IC:\Program Files\Java\jdk1.7.0_21\include -IC:\Program Files\Java\jdk1.7.0_21\include\win3 -shared -o HelloWorld.dll

但是将这些命令放入windows后,它返回错误:

gcc: error: Files\Java\jdk1.7.0_21\include: No such file or directory
gcc: error: Files\Java\jdk1.7.0_21\include\win3: No such file or directory

我无法清除它! :((

【问题讨论】:

  • 显然您需要转义或引用参数中的空格。如果您不这样做,则空格之后的任何内容都将被视为另一个参数。因此出现错误。
  • 您能告诉我先生吗?暗隼

标签: java c dll header java-native-interface


【解决方案1】:

您可以使用 SWIG(请参阅 http://www.swig.org/)在 C 代码之上生成 Java API 包装器。 您只需要编写一个 swig 接口文件,swig 使用它来为不同的类及其包含的方法生成适当的 .java 文件。

在您当前的方法中,您面临的一个问题是您需要在 Program Files 周围加上引号以转义空格。

【讨论】:

  • 但即使在加上引号后,它也带有无效的参数:((你能指定引号的位置吗?实际上我在编程方面很天真
  • 在整个路径“C:\Program Files\Java\jdk1.7.0_21\include”周围加上引号
  • 是的,我说的是,但它再次抛出错误:**HelloWorld.c:3:21: 致命错误:JavaToC.h:没有这样的文件或目录**
  • 这是一个不同的问题。不是原来的问题“gcc: error: Files\Java\jdk1.7.0_21\include: No such file or directory”。该文件实际上位于何处?包括它的路径吗?
  • 是的,我已经在操作系统路径中指定了这个路径!我现在该怎么办? link我正在使用上面提到的这个教程链接。
【解决方案2】:

gcc -c -I"/usr/lib/jvm/java-8-openjdk-amd64/include" -I"/usr/lib/jvm/java-8-openjdk-amd64/include/linux" HelloJNI.c

在 Ubuntu 中,文件名为 HelloJNI.c -I/usr/lib/jvm...... 是保存文件的路径。

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 2013-03-11
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2014-08-22
    • 2018-10-17
    • 2023-04-02
    • 2013-04-21
    相关资源
    最近更新 更多