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

标签 java java-native-interface

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

相关文章:

java - 使用 C 语言通过 FFmpeg 保存部分视频

java - JNI : passing bytes from c++ to java

java - 将 Spring Boot 应用程序部署到 Websphere 8.5.5.8

java - 替换java中的整个字符串

java - LibGDX:获取边界的问题

java - 我应该在 GetIntArrayElements 之后调用 ReleaseIntArrayElements 吗?

java - JNI native 函数内的自定义内存分配

java - 如何使用整数参数的二进制表示来过滤数组?

java - Hibernate 示例查询

android-studio - 为什么我的 native 库没有加载?