博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]linux下JNI开发步骤详解
阅读量:5108 次
发布时间:2019-06-13

本文共 2688 字,大约阅读时间需要 8 分钟。

 转载地址:http://www.cnblogs.com/snake-hand/archive/2012/05/25/2517412.html

前期准备:

1、Java JDK    : 报错可以参考,下载与安装可以参考

2、gcc

3、g++

注意:gcc和g++的版本号要一致:如下:

[juan@juan~]$ gcc --version  gcc (GCC)  4.6 . 3   20120306  (Red Hat  4.6 . 3 - 2 )  Copyright (C) 2011  Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    [qiaoning@qiaoning ~]$ g++ --version  bash: g++: command not found...  [qiaoning@qiaoning ~]$ gcc --version  gcc (GCC)  4.6 . 3   20120306  (Red Hat  4.6 . 3 - 2 )  Copyright (C) 2011  Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

linux(Fedora) 安装gcc yum install gcc 安装g++ yum install gcc-c++

确保上述准备工作完成后开始下边的工作:

Java代码:

public   class  Hello {      static  {          try  {              System.loadLibrary("hello" );                      } catch  (UnsatisfiedLinkError e) {              e.printStackTrace();          }      }            public  Hello() {};            public   native   void  SayHello(String strName);  }

在终端输入 javac Hello.java 后生成Hello.class 文件

然后:javah Hello 生成 Hello.h文件

 

然后在相同的目录下新建一个Hello.cpp文件:内容如下:

 

 

原因:没有安装g++,或者gcc和g++的版本不一致

 

 

/usr/lib/jvm/java- 1.6 . 0 -openjdk- 1.6 . 0.0  根据自己机器实际的目录做相应的调整

编译成功后生成Hello.o

gcc -shared -Wl,-soname,libhello.so. 1  -o libhello.so. 1.0  Hello.o
gcc -shared  -Wl,-soname,libhello.so.1 -o libhello.so.1.0 Hello.o

此命令生成生成 libhello.so.1.0

接下来将生成的共享库拷贝为标准文件名

cp libhello.so. 1.0  libhello.so  

最后通知动态链接程序此共享文件的路径。

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH  

 

接下来将生成的共享库拷贝为标准文件名

 

cp libhello.so.1.0 libhello.so

 

最后通知动态链接程序此共享文件的路径。

 

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 

 

最后是java测试代码:

 

public   class  ToSay    {        public   static   void  main(String argv[])        {            ToSay say = new  ToSay();        }        public  ToSay()        {            Hello h = new  Hello();            // 调用本地方法向 John 问好            h.SayHello("John" );                   }    }

 

用 javac 编译 ToSay.java,生成 ToSay.class 

向执行普通 Java 程序一样使用 java ToSay,我们会看到在屏幕上出现 Hello,John。 

 

应用中注意事项:

1 . 如果可以通过 TCP/IP 实现 Java 代码与本地 C/C++ 代码的交互工作,那么最好不使用以上提到的 JNI 的方式,因为一次 JNI 调用非常耗时,大概要花 0.5 ~ 1 个毫秒。

2 . 在一个 Applet 应用中,不要使用 JNI。因为在 applet 中可能引发安全异常。

3 . 将所有本地方法都封装在单个类中,这个类调用单个 DLL。对于每种目标操作系统,都可以用特定于适当平台的版本替换这个 DLL。这样就可以将本地代码的影响减至最小,并有助于将以后所需的移植问题包含在内。

4 . 本地方法要简单。尽量将生成的 DLL 对任何第三方运行时 DLL 的依赖减到最小。使本地方法尽量独立,以将加载 DLL 和应用程序所需的开销减到最小。如果必须要运行时 DLL,则应随应用程序一起提供它们。

5 . 本地代码运行时,没有有效地防数组越界错误、错误指针引用带来的间接错误等。所以必须保证保证本地代码的稳定性,因为,丝毫的错误都可能导致 Java 虚拟机崩溃。

 

转载于:https://www.cnblogs.com/Crysaty/p/6698915.html

你可能感兴趣的文章
JavaScript 克隆数组
查看>>
【题解】[P4178 Tree]
查看>>
cer证书签名验证
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
QML学习笔记之一
查看>>
App右上角数字
查看>>
WPF中实现多选ComboBox控件
查看>>
TestNG入门
查看>>
【ul开发攻略】HTML5/CSS3菜单代码 阴影+发光+圆角
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
ActiveMQ与spring整合
查看>>
关于TFS2010使用常见问题
查看>>
poj2752 Seek the Name, Seek the Fame
查看>>
理解oracle中连接和会话
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>