麻烦运行一个非常简单的Hello World JNI测试

时间:2011-04-08 18:37:14

标签: java c++ exception java-native-interface codeblocks

EDIT3:这是导致问题的编译器标志,如果我使用Microsoft的编译器从命令行编译它可以正常工作。有没有人知道我需要更改code :: blocks来解决这个问题?

当我运行我的代码时,我得到一个UnsatisfiedLinkError。加载步骤工作正常,我在实际调用代码时收到错误。

开始使用我的dll路径

java -Djava.library.path=E:\Java\JNIHellowWorld\PasswordGenHW\bin\Debug -jar dist\JNIHellowWorld.jar

例外

Exception in thread "main" java.lang.UnsatisfiedLinkError: jnihellowworld.Main.HelloWorld()Ljava/lang/String;
        at jnihellowworld.Main.HelloWorld(Native Method)
        at jnihellowworld.Main.main(Main.java:16)

Java代码

package jnihellowworld;
import java.io.IOException;
public class Main {
    public native String HelloWorld() throws Error;
    public static void main(String[] args) throws IOException {
        try
        {
        System.loadLibrary("PasswordGenHW");
        String test = new Main().HelloWorld(); //errors on this line
        System.out.println(test);
        System.in.read();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

C ++标题

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnihellowworld_Main */

#ifndef _Included_jnihellowworld_Main
#define _Included_jnihellowworld_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     jnihellowworld_Main
 * Method:    HelloWorld
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

C ++ cpp

#include "jnihellowworld_Main.h"
#include <jni.h>

JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld
  (JNIEnv *env, jobject obj)
  {
      return env->NewStringUTF("Hello world!");
  }

我使用Code :: Blocks和GCC来编译dll。

编辑:这是dll的dumpbin / exports

2    1 000011D8 Java_jnihellowworld_Main_HelloWorld@8

EDIT2:使用system.loadLibrary()复制错误的简化项目

2 个答案:

答案 0 :(得分:0)

尝试在编译和链接上添加这些标志:

-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at

示例:

gcc -c -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.c

gcc -shared -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.o -o mylib.dll

答案 1 :(得分:0)

我最终只是使用微软的编译器手工编译。