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



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

之前做过一个项目有用到过JNI,最初也是各种不懂,经过自己的不断摸索,开始有了眉目,知道的了怎么使用。我是有在Linux和windows平台都用了JNI,在这里简单分享以下在Linxu平台上开发用了J...
  • u010212643
  • u010212643
  • 2017年04月07日 15:45
  • 1216

java调用.so文件

//第一步, public class JavaToCTest { private native void sayHello(); //声明本地方法. static { System.loadLibr...
  • shaohuazuo
  • shaohuazuo
  • 2013年12月03日 17:21
  • 5568

java调用so

  • 2013年02月25日 11:06
  • 1007B
  • 下载

java 调用.so 文件

  • 2012年08月31日 15:37
  • 11KB
  • 下载

java调用so库

Jnative的使用(Linux系统下so调用) 1.环境配置 下载JNative_src.zip和JNative.jar,JNative_src解压会有JNativeCpp.dll和libJNa...
  • kj654
  • kj654
  • 2015年12月29日 12:03
  • 3875

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

1.确保gcc编译器已安装 2.编写HelloJNI.java代码,用native声明需要用C实现的函数。 package net.wangliping public class He...
  • caiwenfeng_for_23
  • caiwenfeng_for_23
  • 2015年04月09日 15:31
  • 2948

java调用dll或so库示例

  • 2017年08月31日 10:01
  • 101KB
  • 下载

windows下使用eclipse java程序调用.so文件

问题描述: Java项目,做中间件的,之前是在Linux系统下开发,用JNI调用内核部提供的.so文件,但是现在又要Windows系统下测试运行情况,所以提出了题目中的问题:怎么在Windows下使用...
  • ADDLHX
  • ADDLHX
  • 2017年08月15日 16:29
  • 938

java调用so动态链接库

用JNI实现 实例: 创建HelloWorld.java class HelloWorld { private native void print(); public staticvo...
  • qiuyujiaoqiuyulong
  • qiuyujiaoqiuyulong
  • 2012年12月14日 10:09
  • 3760

Eclipse下NDK开发(java调用so文件)

eclipse下两种配置方式: 一种是右键工程选择properties->builders->new->program,然后再做相应的选择,因为这种方式我没有尝试过,网上也有例子,所以我就不做详...
  • cym492224103
  • cym492224103
  • 2014年09月03日 17:03
  • 1853
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux平台Java调用so库-JNI使用例子
举报原因:
原因补充:

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