JNI(Java和C++)在Ubuntu 11.10上使用Eclipse

JNI(Java和C++)在Ubuntu 11.10上使用Eclipse,java,c++,java-native-interface,Java,C++,Java Native Interface,嗨,我是JNI新手,我只是想用Eclipse获得一个简单的JNI示例。我遵循了以下教程中的步骤:我的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 = n

嗨,我是JNI新手,我只是想用Eclipse获得一个简单的JNI示例。我遵循了以下教程中的步骤:我的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));
    }
 }
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_getDouble
  (JNIEnv *env, jobject obj, jint n)
{
    return n*2;
}
然后,我使用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
然后,我按照教程中的说明配置项目生成设置。当我构建项目时,它创建了.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,那么一切都会按它应该的方式运行。让这个方法带参数不知何故把一切都搞糟了。我在这个错误上花了十多个小时,搜索了很多论坛,但没有找到解决这个问题的方法。任何帮助都将不胜感激。谢谢

将函数体放在一个cpp文件中,JNI回调必须遵循C风格的名称mangling

在您的cpp文件中尝试以下操作:

extern "C"
{

JNIEXPORT jint JNICALL Java_Main_getDouble
  (JNIEnv *env, jobject obj, jint n)
{
    return n*2;
}

}
include Main.h解决了这个问题/home/ryan/Desktop/libJNILibrary3.so显示了Java\u Main\u getDouble?如果没有,那么您没有正确编译库