坚持使用JNI - 需要帮助

时间:2014-02-10 18:06:22

标签: java java-native-interface

我开发了我的Java应用程序,但突然遇到了JNI。 我尝试编译并运行大多数简单的JNI应用程序(只是为了弄清楚什么是错的)。我有Win7 x64,JDK 7 32位,MinGW。 这是我的Java类,只有一个本机方法。

package my.pack;

public class Foo
{
    static
    {
        try
        {
            System.loadLibrary("foo");
        } catch (UnsatisfiedLinkError e)
        {
            System.out.println("Could not load native library");
        }
    }

    public static void main(String[] args)
    {

        Foo foo = new Foo();
        foo.foo();
    }

    public native void foo();
}

我跑

javah my.pack.Foo

生成my_pack_Foo.h

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

#ifndef _Included_my_pack_Foo
#define _Included_my_pack_Foo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     my_pack_Foo
 * Method:    foo
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_my_pack_Foo_foo
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

然后我在my_pack_Foo.cpp

中实现它
#include <jni.h>
#include <cstdio>
#include "my_pack_Foo.h"
JNIEXPORT void JNICALL Java_my_pack_Foo_foo(JNIEnv *env, jobject obj)
{
    puts("HELLO WORLD!");
}

然后我编译cpp文件:

g++ -shared -o foo.dll my_pack_Foo.cpp -I c:/JDK/include -I c:/JDK/include/win32

我尝试使用32位JVM运行已编译的Foo.java但收到错误(foo.dll在系统路径上):

Exception in thread "main" java.lang.UnsatisfiedLinkError: my.pack.Foo.foo()V
        at my.pack.Foo.foo(Native Method)
        at my.pack.Foo.main(Foo.java:20)

一切似乎都是正确的,但出了什么问题?

1 个答案:

答案 0 :(得分:1)

链接时,请使用以下选项

-Wl,--export-all-symbols -Wl,--add-stdcall-alias -m32 -shared

使用Dependency Walker(http://www.dependencywalker.com/)验证您之前和之后的出口,以查看差异。