当前位置: 首页 > 知识库问答 >
问题:

获取/usr/bin/ld:找不到-ljvm collect2:ld返回1退出状态make:***[hello_world]尝试调用java类方法时错误1

毕泽宇
2023-03-14

我试图用JNI从c调用java类方法。我做了一个简单的hello_world.java和hello_world.c以及一个Makefile,在执行make命令时,我得到了以下错误。请帮帮我

make gcc hello_world.c-o hello_world\-l/usr/java/latest/jre/lib/i386/server/\\-ljvm\-i/usr/java/lates/include/\\-i/usr/java/lates/include/\\i/usr/java/lates/include/\\hello_world.c/usr/java/lib/i386/server//libjvm.so搜索-ljvm/usr/jre/bin/ld:跳过不兼容的

public class hello_world{
  public static void main(String[] args){
    System.out.println("Hello, World");
  }
  public static int square(int input){
    int output = input * input;
    return output;
  }
  public static int power(int input, int exponent){
    int output,i;
    output=1;
    for(i=0;i<exponent;i++){
      output *= input;
    }
    return output;
  }
}
#include <stdio.h>
#include <jni.h>

JNIEnv* create_vm(JavaVM **jvm)
{
    JNIEnv* env;
    JavaVMInitArgs args;
    JavaVMOption options;
    args.version = JNI_VERSION_1_6;
    args.nOptions = 1;
    options.optionString = "-Djava.class.path=./";
    args.options = &options;
    args.ignoreUnrecognized = 0;
    int rv;
    rv = JNI_CreateJavaVM(jvm, (void**)&env, &args);
    if (rv < 0 || !env)
        printf("Unable to Launch JVM %d\n",rv);
    else
        printf("Launched JVM! :)\n");
    return env;
}

void invoke_class(JNIEnv* env)
{
    jclass hello_world_class;
    jmethodID main_method;
    jmethodID square_method;
    jmethodID power_method;
    jint number=20;
    jint exponent=3;
    hello_world_class = (*env)->FindClass(env, "helloWorld");
    main_method = (*env)->GetStaticMethodID(env, hello_world_class, "main", "([Ljava/lang/String;)V");
    square_method = (*env)->GetStaticMethodID(env, hello_world_class, "square", "(I)I");
    power_method = (*env)->GetStaticMethodID(env, hello_world_class, "power", "(II)I");
    (*env)->CallStaticVoidMethod(env, hello_world_class, main_method, NULL);
    printf("%d squared is %d\n", number,
        (*env)->CallStaticIntMethod(env, hello_world_class, square_method, number));
    printf("%d raised to the %d power is %d\n", number, exponent,
        (*env)->CallStaticIntMethod(env, hello_world_class, power_method, number, exponent));
}

int main(int argc, char **argv)
{
    JavaVM *jvm;
    JNIEnv *env;
    env = create_vm(&jvm);
    if(env == NULL)
        return 1;
    invoke_class(env);
    return 0;
}
all:run

hello_world.class:hello_world.java
        /usr/java/latest/bin/javac hello_world.java

hello_world: hello_world.c
        gcc -o hello_world \
        -L /usr/java/latest/jre/lib/i386/server/ \
        -ljvm \
        -I /usr/java/latest/include/ \
        -I /usr/java/latest/include/linux/ \
        hello_world.c

run: hello_world.class hello_world
        export LD_LIBRARY_PATH="/usr/java/latest/jre/lib/i386/server/"
        ./hello_world

clean:
        rm -f hello_world.class hello_world

共有1个答案

凌运恒
2023-03-14

-ljvm将由GCC转换为libjvm.so并尝试在-l路径中找到它。如果你找到好的,试着看看你的文件夹。所以

 类似资料:
  • 我不能编译yacc I lex: 输出错误:

  • 问题内容: 我正在尝试编译我的程序,它返回此错误: 在我的makefile文件中,我使用命令并链接到我的库,这是到我的库的另一个目录的符号链接。 是否可以添加选项以使其正常工作? 问题答案: 如果您的图书馆名称是say 并且位于路径上,请说: 然后将其链接到您的程序:

  • 问题内容: 我正在尝试使用Python 2.7安装MySQLdb。我收到的错误如下所示: 显然,它找不到Python 2.7。展望我看到: 该符号是什么意思?谁能建议对此错误采取补救措施? 问题答案: 它找不到Python库,而不是可执行文件。运行以查看Python库的位置,然后将其添加到库路径(例如,如果位于中,则要调用)。 该符号意味着该文件是一个符号链接; 表示它是可执行文件(这些文件由产生

  • 因此,我试图使用make-f Makefile编译一个程序,但我得到了以下错误/usr/bin/ld:not find-lgd 生成文件: 替换(libgd.a libgd.la libgd.so libgd.so.2 libgd.so.2.0.0)后,我收到以下错误:

  • 我试图编译我的程序,它返回这个错误: 在我的makefile中,我使用命令并链接到我的库,这是一个符号链接到我位于其他目录上的库。 是否有一个选项添加,使其工作,请?

  • 我试着编译这段代码一段时间。具体来说,我正在尝试使用给定的mac编译avx2代码。然而,我总是遇到以下错误。我查了很多资料,但找不到解决办法。如果你能帮我找到解决办法,我将非常高兴。 /usr/bin/ld: 找不到 -lc collect2:错误:ld返回1个退出状态 : *** [测试/test_kyber]错误1 gcc版本 全球合作委员会 (GCC) 4.8.5 20150623(红帽 4