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

标签 java c++ java-native-interface

您好,我是 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;
}

然后我按照教程中的说明配置项目build设置。当我构建项目时,它创建了“.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 风格的名称修饰。

在你的 cpp 文件中试试这个:

extern "C"
{

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

}

关于java - JNI(Java 和 C++)在 Ubuntu 11.10 上使用 Eclipse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14614349/

相关文章:

java - 使用gradle构建一个非常简单的java程序

java - 如何使用 Java 中的 Joda 时间库获取 ISO 年的月份开始和结束日期

c++ - 使用 "cin"对象的问题

java - 在 ubuntu 上使用 JNI 时出错 : java. lang.UnsatisfiedLinkError : no . .. in java.library.path

Java通过JNI转C#无法加载C# dll

java - 在 Java 中加载静态编译的库

java - Twitter Streaming API 速率限制..如何处理?

Java 2D 数组长度

c++ - 警告 C5029 是否仅指示正在使用 Microsoft 扩展?

c++ - C++字数统计程序