Tôi đang cố gắng sử dụng JNI và nhận được java.lang.UnsatisfiedLinkError. Không giống như hàng triệu câu hỏi khác được hỏi về điều này, tôi có lib trên đường dẫn của tôi, và thậm chí còn thấy sự thay đổi ngoại lệ khi tôi gỡ bỏ nó. Tôi chắc chắn rằng một cái gì đó là sai với dll tôi đã tạo ra, nhưng tôi không chắc chắn những gì.JNI: Thư viện được tìm thấy trên đường dẫn, nhưng phương pháp không phải là (java.lang.UnsatisfiedLinkError)
Đây là mã lớp java của tôi:
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);
}
Dưới đây là phần rút gọn của javah sản xuất tập tin tiêu đề của tôi:
/*
* Class: com_Tune
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_Tune_add
(JNIEnv *, jobject, jint, jint);
Đây là c của tôi ++ mã:
#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;
}
Dưới đây là ngoại lệ thời gian chạy tôi nhận được từ nhật thực:
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)
Tôi đọc rằng ngoại lệ trên có nghĩa là DID tìm thư viện "lala", nhưng phương thức "thêm" vẫn chưa được xác định. Điều duy nhất tôi nhìn thấy khác nhau giữa dự án của tôi và hướng dẫn là:
- Mine sử dụng một gói, thay vì gói mặc định (không nên hướng dẫn thực sự làm được điều này thôi nào chúng ta hãy chuyên nghiệp?!?!)
- Mỏ có giá trị trả lại.
- tôi chuyển dll của tôi sau khi nó đã được tạo ra (tôi không nghĩ rằng điều này sẽ phá vỡ nó kể từ khi con đường của tôi được cấu hình.)
Làm thế nào có thể như vậy?
Thông tin khác:
Hệ điều hành: Windows 7
JDK: 1.6.0_31 (cho x86, 32 bit JVM)
C++ IDE: Code :: Blocks (dll được biên soạn tự động bởi Bộ luật :: Blocks IDE)
C++: MinGW32-g ++ (GNU C++)
tôi có jni.h và com_Tune.h trong C: \ _ \ include
tôi có lala.dll trong C: \ _ \ lib
Biến môi trường:
PATH: C: \ Program Files (x86) \ Tập đoàn NVIDIA \ PhysX \ Common;% CommonProgramFiles% \ Microsoft chia sẻ \ Windows Live; C: \ Program Files (x86) \ AMD APP \ bin \ x86_64; C : \ Program Files (x86) \ AMD APP \ bin \ x86;% SystemRoot% \ system32;% SystemRoot%;% SystemRoot% \ System32 \ Wbem;% SYSTEMROOT% \ System32 \ WindowsPowerShell \ v1.0 \; C: \ Chương trình Tệp (x86) \ ATI Công nghệ \ ATI.ACE \ Lõi-Tĩnh; C: \ Ứng dụng;% JAVA_HOME% \ bin; C: \ Program Files \ MySQL \ MySQL Máy chủ 5.5 \ bin;% MAVEN_HOME% \ bin;% HADOOP_INSTALL% \ bin; c: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ Công cụ \ Binn \; c: \ Program Files \ Microsoft SQL Server \ 100 \ Công cụ \ Binn \; c: \ Program Files \ Microsoft SQL Server \ 100 \ DTS \ Binn \; C: \ MinGW \ bin; C: \ Program Files (x86) \ GnuWin32 \ bin; C: _ \ path; C: \ _ \ lib; C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin; C: \ _ \ include
mã này dường như đúng. Bạn có thể kiểm tra bảng xuất DLL (tức là với Dependency Walker) và đảm bảo rằng chức năng của bạn có mặt trong xuất khẩu không? – Mersenne