java jni调用so动态库_JNI java调用so动态库方法

标签:JNI(5)JAVA(608)

接着上一篇 JNI Java调用so包相关问题总结,出现了很多问题,按照操作应该不会发生不到so包的错误,其实最后出现的也是说加载不到libpython2.7.x.so.1,我就纳闷了,怎么和python扯上关系了? 测试环境的python版本是2.6所以换了台机器,没有再出现找不到python的so包问题,取而代之的是无法找到本地方法,原来算法小哥哥是用Cython编译的so包,原版本是用python写的ORZ……

现在总结下java调用动态链接库的正确步骤,之前有记过windows版本 JNI HelloWorld的例子 调用的是.dll,这里再顺便记录下linux版本的

首先编写好java文件,确定好需要调用的naTIve方法,再生成相应的.h头文件

public class ATest {

private naTIve void hello();

staTIc{

System.load(“/root/jni/lib/libAtest.so”);

}

public staTIc void main(String[] args){

ATest test = new ATest();

test.hello();

}

}

执行指令javah -jni -classpath 类目录 -d 目的目录 类名

生成的头文件如下

/* DO NOT EDIT THIS FILE - it is machine generated */

#include 《jni.h》

/* Header for class ATest */

#ifndef _Included_ATest

#define _Included_ATest

#ifdef __cplusplus

extern “C” {

#endif

/*

* Class: ATest

* Method: hello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_ATest_hello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

再在.c文件中引入头文件并且实现对应的方法

#include《jni.h》

#include《stdio.h》

#include“ATest.h”

/*

* Class: ATest

* Method: hello

* Signature: ()V

*/

JNIEXPORT void JNICALL Java_ATest_hello

(JNIEnv *, jobject){

printf(“hello,heqianqian”);

}

最后把.c文件打包成so文件(前提是需要安装完gcc或者g++)

g++ -I“/usr/local/java/jdk1.8.0_121/include/linux” -I“/usr/local/java/jdk1.8.0_121/include” -fpic

-I 选项后面添加的是jdk的include目录以及include下的linux目录地址,如果不添加会出现找不到jni.h头文件以及jni_md.h文件。

编译完成之后就能产生目的so包,拷贝到指定目录下,再运行之前的ATest.java文件即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值