JNI:图书馆在路径上找到,但方法不是(java.lang.unsatisfiedlinkerror)

 2023-01-20    375  

问题描述

我正在尝试使用jni并获得java.lang.unsatisfiedlinkerror.与其他有关此问题的问题不同,我的道路上有LIB,甚至在删除它时也看到了例外变化.我确定我创建的DLL有问题,但我不确定是什么.

这是我的Java类代码:

JNI:图书馆在路径上找到,但方法不是(java.lang.unsatisfiedlinkerror)

package com;

public class Tune {
    static {
        System.loadLibrary("lala");
    }
    public static void main(String[] args) {
        Tune j = new Tune();
        System.out.println("2+6="+j.add(2, 6));
    }
    native public int add(int x,int y);
}

这是我Javah生成的标头文件的删节部分:

/*
 * Class:     com_Tune
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_Tune_add
  (JNIEnv *, jobject, jint, jint);

这是我的C ++代码:

#include <jni.h>
#include <com_Tune.h>

JNIEXPORT jint JNICALL Java_com_Tune_add
  (JNIEnv * env, jobject obj, jint x, jint y) {
    return x+y;
  }

这是我从Eclipse获得的运行时例外:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.Tune.add(II)I
    at com.Tune.add(Native Method)
    at com.Tune.main(Tune.java:9)

我读到上面的异常意味着它确实找到了库” lala”,但是该方法” add”仍未定义.我在项目和教程之间看到的唯一不同之处是:

  • 我使用一个软件包,而不是默认包(教程不应该真的这样做吗?!?!
    • 我的回报值.
    • 我将其创建后移动了DLL(我认为这不会因为配置我的路径而破坏它.)

这是怎么可能的?

其他信息:

OS:Windows 7
JDK:1.6.0_31(x86,32位JVM)
C ++ IDE:code :: blocks(DLL是由Code :: Blocks IDE自动编译的)
C ++编译器:Mingw32-G ++(GNU C ++编译器)

我在c:\ _ \ include
中有jni.h和com_tune.h
我在c:\ _ \ lib

中有lala.dll

环境变量:
路径:c:\ program文件(x86)\ nvidia corporation \ physx \ common;%communprogramfiles%\ microsoft共享\ windows \ windows live; c:\ program files(x86)\ amd app \ bin \ bin \ x86_64; c:\ program files(\ program文件(\ program文件( X86)\ AMD App \ bin \ x86;%SystemRoot%\ System32;%SystemRoot%;%SystemRoot%\ System32 \ wbem;%SystemRoot%\ System32 \ WindowsPowerShell \ v1.0 \ v1.0 \; c:c:c:\ Program Files(x86)\ ATI Technologies \ ati.ace \ core static; c:\ apps;%java_home%\ bin; c:\ program文件\ mysql \ mysql \ mysql \ mysql Server 5.5 \ bin;%maven_home%\ bin;%hadoop_inp_inp_install%\ bin; c:c:c:c:c:c:c:c:c:c:c: \ program Files(x86)\ Microsoft SQL Server \ 100 \ Tools \ binn \; c:\ program Files \ Microsoft SQL Server \ 100 \ 100 \ Tools \ binn \; c:\ program Files \ Microsoft SQL SQL Server \ 100 \ 100 \ dts \ dts \ binn \; c:\ mingw \ bin; c:\ program文件(x86)\ gnuwin32 \ bin; c:_ \ path; c:\ _ \ lib; c:\ program files(x86)\ microsoft Visual Studio 10.0 \ VC VC \ bin; c:\ _ \ include

推荐答案

只是猜测…您的DLL是否取决于另一个不在路径上的DLL? mingw模块通常取决于特定的C运行时库.

其他推荐答案

问题是编译器已生成:Java_com_Tune_add@16

使用两个

之一

gcc -Wl,-kill-at

gcc -Wl,–add-stdcall-alias

这将确保生成java_com_tune_add

然后您的方法调用将成功.

其他推荐答案

问题的一种可能来源可能是您使用C ++编译器编译了代码,该编译器使用与普通C的[呼叫惯例]不同.像这样的extern “C”块中的方法:

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_com_Tune_add
...

#ifdef __cplusplus
}
#endif

以上所述是小编给大家介绍的JNI:图书馆在路径上找到,但方法不是(java.lang.unsatisfiedlinkerror),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26136.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。