0
我開發了我的Java應用程序,但突然被JNI卡住了。 我嘗試編譯並運行最簡單的JNI應用程序(只是爲了弄清楚什麼是錯的)。我有Win7 x64,JDK 7 32位,MinGW。 這是我的Java類與一個本地方法。被JNI困住 - 需要幫助
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
我嘗試運行編譯Foo.java與32位JVM,但得到的錯誤(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)
一切似乎是正確的,但有什麼不對?
您可能會嘗試的兩件事是添加日誌記錄以指示成功的庫加載(即使理論上您已經記錄失敗),並使用objdump或其他方法檢查該庫,並查看問題中的函數是否真的存在,並以預期的名稱。既然你是從C++開始的,你可能會遇到一些與名稱混淆有關的問題? –
你在'nm --extern-only --defined-only'你的DLL中看到了什麼? –