2023-01-20 375
我正在尝试使用jni并获得java.lang.unsatisfiedlinkerror.与其他有关此问题的问题不同,我的道路上有LIB,甚至在删除它时也看到了例外变化.我确定我创建的DLL有问题,但我不确定是什么.
这是我的Java类代码:
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”仍未定义.我在项目和教程之间看到的唯一不同之处是:
这是怎么可能的?
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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态