linux下java调用C
来源:互联网 发布:linux 设置权限 编辑:程序博客网 时间:2024/05/18 02:09
下面是在ubuntu 下java jni调用C语言动态链接库的具体操作步骤。
1、创建一个Java程序(TestJNI.java)定义原生的c函数。
2、用javac编译TestJNI.java生成TestJNI.class。用javah带-jni参数编译TestJNI.class生成TestJNI.h文件,该文件中 定义了c的函数原型。在实现c函数的时候需要。
3、创建Hello.c,实现TestJNI.h定义的函数。
4、编译Hello.c生成libgoodlucky.so。
5、在java虚拟机运行java程序TestJNI。
2、javac TestJNI.java
javah -jni Test
生成了TestJNI.h文件
内容如下:
3、 TestJNI.c,内容如下
4、
生成:对象文件TestJNI.o
gcc -Wall -fPIC -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux
生成动态库libgoodlucky.so 注意这里的goodlucky 对应TestJNI.java中goodlucky。并且这里要以lib开头命名动态库.-Wall 显示错误和警告提示 -I(不是l,就是这个害死我了,汗)后面是 jni.h,jni_md.h的路径
gcc -Wall -rdynamic -shared -o libgoodlucky.so TestJNI.o
上面的两条命令等价于下面的命令:
gcc -Wall -fPIC -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux -shared -o libgoodlucky.so TestJNI.c
编译器选项-fpic和链接器选项-shared
修改.bash_profile文件,配置环境变量,由于生成的.so文件在当前目录下,故
.bash_profile文件设置如下
export LD_LIBRARY_PATH=./
或者把生成的.so文件放到/usr/lib目录下也可以。
5、java TestJNI
进阶:
1、在第四步中,编写makefile文件
内容如下:
格式如下:
一个 makefile 主要含有一系列的规则,如下:
A: B
(tab)<command>
(tab)<command>
每个命令行前都必须有tab符号。
具体可参考:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html
参考见:
http://watershitter.iteye.com/blog/477615#comments
http://lwjlaser.iteye.com/blog/779270
http://blog.csdn.net/kangkanglou/article/details/5807787
思考若是java文件带有包路径呢?可以去动手做做
1、创建一个Java程序(TestJNI.java)定义原生的c函数。
2、用javac编译TestJNI.java生成TestJNI.class。用javah带-jni参数编译TestJNI.class生成TestJNI.h文件,该文件中 定义了c的函数原型。在实现c函数的时候需要。
3、创建Hello.c,实现TestJNI.h定义的函数。
4、编译Hello.c生成libgoodlucky.so。
5、在java虚拟机运行java程序TestJNI。
1、Test.java 源文件
public class TestJNI { static{ System.loadLibrary("goodlucky"); } public native void set(int value); public native int get(); public static void main(String[] args) { TestJNI td=new TestJNI(); td.set(10); System.out.println(td.get()); }}
2、javac TestJNI.java
javah -jni Test
生成了TestJNI.h文件
内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class TestJNI */ #ifndef _Included_TestJNI #define _Included_TestJNI #ifdef __cplusplus extern "C" { #endif /* * Class: TestJNI * Method: set * Signature: (I)V */ JNIEXPORT void JNICALL Java_TestJNI_set (JNIEnv *, jobject, jint); /* * Class: TestJNI * Method: get * Signature: ()I */ JNIEXPORT jint JNICALL Java_TestJNI_get (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
3、 TestJNI.c,内容如下
#include <stdio.h> #include "TestJNI.h" int i=0; JNIEXPORT void JNICALL Java_TestJNI_set (JNIEnv * env, jobject obj, jint j) { i=j; } JNIEXPORT jint JNICALL Java_TestJNI_get (JNIEnv * env, jobject obj) { return i; }
4、
生成:对象文件TestJNI.o
gcc -Wall -fPIC -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux
生成动态库libgoodlucky.so 注意这里的goodlucky 对应TestJNI.java中goodlucky。并且这里要以lib开头命名动态库.-Wall 显示错误和警告提示 -I(不是l,就是这个害死我了,汗)后面是 jni.h,jni_md.h的路径
gcc -Wall -rdynamic -shared -o libgoodlucky.so TestJNI.o
上面的两条命令等价于下面的命令:
gcc -Wall -fPIC -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux -shared -o libgoodlucky.so TestJNI.c
编译器选项-fpic和链接器选项-shared
修改.bash_profile文件,配置环境变量,由于生成的.so文件在当前目录下,故
.bash_profile文件设置如下
export LD_LIBRARY_PATH=./
或者把生成的.so文件放到/usr/lib目录下也可以。
5、java TestJNI
进阶:
1、在第四步中,编写makefile文件
内容如下:
libgoodlucky.so:TestJNI.o makefile gcc -Wall -rdynamic -shared -o libgoodlucky.so TestJNI.oTestJNI.o:TestJNI.c TestJNI.h gcc -Wall -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linuxcl: rm -rf *.o *.so
格式如下:
一个 makefile 主要含有一系列的规则,如下:
A: B
(tab)<command>
(tab)<command>
每个命令行前都必须有tab符号。
具体可参考:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html
参考见:
http://watershitter.iteye.com/blog/477615#comments
http://lwjlaser.iteye.com/blog/779270
http://blog.csdn.net/kangkanglou/article/details/5807787
思考若是java文件带有包路径呢?可以去动手做做
- linux下java调用C
- linux下java调用C
- Linux下Java调用C
- java调用c(linux下)
- Java调用C(Linux下实现Java本地方法)
- Java调用C(Linux下实现Java本地方法)
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库
- linux下 java JNI调用C语言动态链接库
- linux下java 调用 c jni 实现 HelloWorld
- Linux下用java 调用 C类库实战 视频
- Linux下通过java调用C/C++代码
- Linux下C调用Python
- Mac下java 调用C
- linux java 调用C 库
- linux下java调用浏览器
- JNI(java Native Interface)linux下 java调用本地c函数
- arm-linux下python调用c函数
- 图片验证码类
- 文件长度
- php 数据文件的压缩
- VS2008中VC项目文件目录管理
- jdk1.5以后的多线程同步方式
- linux下java调用C
- 搭建IPv6网络环境
- Uboot常用命令和环境变量
- DDL DML DCL
- 自学通过软件设计师考试后的一些感想
- struts2 Annotation configuration
- java集合类 一
- java整型数与网络字节序的 byte[] 数组转换关系
- 客户端与服务器端交互原理(HTTP数据请求与HTTP响应)