gpt4 book ai didi

java - 陷入 JNI 困境 - 需要帮助

转载 作者:行者123 更新时间:2023-12-01 13:28:33 26 4
gpt4 key购买 nike

我开发了 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com