嗨,我是 JNI 的新手,我只是想用一个简单的 JNI 示例来使用 Eclipse。我按照以下教程中的步骤操作: http: //codeandme.blogspot.com/2011/09/jni-made-easy.html 我的 Java 代码如下:
public class Main
{
private native int getDouble(int n);
public static void main(String[] args)
{
System.load("/home/ryan/Desktop/libJNILibrary3.so");
Main m = new Main();
System.out.println(m.getDouble(3));
}
}
然后我使用 jdk1.7.0_11/bin 中包含的 javah 工具生成头文件。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Main */
#ifndef _Included_Main
#define _Included_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Main
* Method: getDouble
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_Main_getDouble
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
然后我在 Eclipse 中创建了一个 C++ 项目并创建了一个 Main.cpp 源文件。我将 Main.h 文件放在与 Main.cpp 相同的文件夹中。Main.cpp 的代码如下:
#include "Main.h"
JNIEXPORT jint JNICALL Java_Main_getDouble
(JNIEnv *env, jobject obj, jint n)
{
return n*2;
}
然后我按照教程中的说明配置项目构建设置。当我构建项目时,它创建了“.so”文件“libJNILibrary3.so”。然后我运行我的 Java 类“Main”并收到以下错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.getDouble(I)I
at Main.getDouble(Native Method)
at Main.main(Main.java:9)
奇怪的是,如果我重做这个例子,并且让 getDouble 方法不接受任何参数,而只返回值 2,那么一切都会按应有的方式运行。让方法接受参数会以某种方式搞砸一切。我在这个错误上花了十多个小时,并搜索了很多论坛,但没有找到解决这个问题的方法。任何帮助将不胜感激。谢谢!