Linux平台Java调用so库-JNI使用例子

转载 2016年08月31日 08:49:10
首先,编写一个Java文件,包含有native方法
public class MyJni {
    public native void display();

    public native double sum(double x, double y);

    public static void main(String[] args) {
       
    }

}
其次,将此Java文件编译成.h文件
javah 包名.MyJni

执行完此命令,会在目录下生产一个MyJni.h文件

第三,编写一个.c文件,引入刚才的头文件

#include <jni.h>
#include "MyJni.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_MyJni_display(JNIEnv *env,jobject obj){

    printf("Hello JNI");
    return;
}

JNIEXPORT jdouble JNICALL Java_MyJni_sum(JNIEnv *env,jobject obj,jdouble a,jdouble b){

    return a+b;
}

第四,将.c文件编译成.o,再重新转换成.so或者.dll文件
gcc -fPIC -D_REENTRANT -I JDK路径/jdk1.8/include -I JDK路径/jdk1.8/include/linux -c MyJni.c
上面的命令会将C文件编译成.o文件。
gcc -shared Test.o -o libtest.so

上面的命令就能将.o文件编译成.so文件了。


在刚才的java方法中测试一下

public class MyJni {

    static {
        System.load("绝对路径/libtest.so");
    }

    //使用jni的关键字native
    //这个关键字决定我们那些方法能够在C文件使用
    //只须声明,不必实现
    public native void display();

    public native double sum(double x, double y);

    public static void main(String[] args) {
        MyJni myJni = new MyJni();
        System.out.print(myJni.sum(1, 1));
        System.out.print("\n");
        myJni.display();
    }

}

ps:

但是我们还需要注意一个问题,就是如果我们的包含native方法的类,如果引用其他地方的类,那么这时候进入bin\classes\目录下会出现问题提示找不到指定的类,这时候我们需要切换到源码目录src下运行即可。



对于JNIEnv *env来说,在C中调用:

(*env)->NewStringUTF(env, "Hello from JNI!");

而在C++中如果按照上述调用则会发生'base operand of '->' has non-pointer type '_JNIEnv''错误,需要如下调用:

env->NewStringUTF("Hello from JNI!");

原因:参见jni.h中对于JNIEnv的定义:

#if defined(__cplusplus)

typedef _JNIEnv JNIEnv;

#else

typedef const struct JNINativeInterface* JNIEnv;

#endif



相关文章推荐

JNI调用时so链接库文件的路径设置

最近在做JNI程序时,用到了相当于windows环境下的dll--动态链接库的so库,即linux环境下,程序执行时所需要函数链接库。 一般来说的so库路径寻找包括编译时和运行时,因为前边提到的是J...

java jni 调用.so动态库

最近要用到JNI调用动态库,原来根本没接触过有没有,完全听不懂别人说的啥啊,自己鄙视自己一把。 从别的部门同事那里拿来的源码都不会用,于是就学习了一下如何从c文件生成.so文件,再供java...

Linux平台Java调用so库-JNI使用例子

1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数。 package net.wangliping public class He...

Linux平台Java调用so库-JNI使用例子

1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数。 如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/s...
  • rocgege
  • rocgege
  • 2017年02月28日 09:04
  • 2183

Linux下JNI调用简单实例操作全过程

开发环境:Linux(Ubuntu 11.04) + JDK 7 实例说明:利用JNI调用本地代码的方法来实现一个计算Int数组总和的功能 使用JNI调用本地代码,整个开发流程主要包括以下几个步骤...

JNI调用时so链接库文件的路径设置

最近在做JNI程序时,用到了相当于windows环境下的dll--动态链接库的so库,即linux环境下,程序执行时所需要函数链接库。 一般来说的so库路径寻找包括编译时和运行时,因为前边提到的是J...

Linux平台使用JNI的例子 Java调用so

1.确保gcc编译器已安装2.编写HelloJNI.java代码,用native声明需要用C实现的函数。如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如~/Desktop/com...
  • my8688
  • my8688
  • 2011年05月17日 00:05
  • 322

Linux平台Java调用so库-JNI使用例子

Linux平台Java调用so库-JNI使用例子 1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数。 如果源程序是包含在packa...

Linux平台使用JNI的例子 Java调用so

1.确保gcc编译器已安装2.编写HelloJNI.java代码,用native声明需要用C实现的函数。如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如~/Desktop/com...
  • my8688
  • my8688
  • 2011年05月17日 00:05
  • 636

linux平台java调用so动态库

实现将一个自己编写的Hello.c文件打包成libHello.so动态库,并通过gcc编译工具实现用一个test.c程序调用libHello.so和自定义头文件Hello.h的过程。 具体程序代...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux平台Java调用so库-JNI使用例子
举报原因:
原因补充:

(最多只允许输入30个字)