JNI java调用so动态库方法

3G技术应用

1人已加入

描述

  接着上一篇 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文件即可

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分