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



举报

相关文章推荐

java调用.so文件

//第一步, public class JavaToCTest { private native void sayHello(); //声明本地方法. static { System.loadLibr...

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

eclipse下两种配置方式: 一种是右键工程选择properties->builders->new->program,然后再做相应的选择,因为这种方式我没有尝试过,网上也有例子,所以我就不做详...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Java调用C/C++动态库so

参考网址 关于java调用C接口时,类型的转换,如char*  http://blog.csdn.net/zht666/article/details/22786123 JNI的替代者—使用JNA访...

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平台使用JNI的例子 Java调用so

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

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...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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