我开发了 Java 应用程序,但突然陷入了 JNI 的困境。 我尝试编译并运行最简单的 JNI 应用程序(只是为了找出问题所在)。我有 Win7 x64、JDK 7 32 位、MinGW。 这是我的 Java 类,具有单个 native 方法。
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)
一切似乎都是对的,但是哪里出了问题?
最佳答案
链接时,使用以下选项
-Wl,--export-all-symbols -Wl,--add-stdcall-alias -m32 -shared
使用 Dependancy Walker( http://www.dependencywalker.com/ ) 验证之前和之后的导出,以查看差异。
关于java - 陷入 JNI 困境 - 需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21684717/