我开发了我的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)
一切似乎都是正确的,但出了什么问题?
答案 0 :(得分:1)
链接时,请使用以下选项
-Wl,--export-all-symbols -Wl,--add-stdcall-alias -m32 -shared
使用Dependency Walker(http://www.dependencywalker.com/)验证您之前和之后的出口,以查看差异。