linux java调用c 代码_linux下java调用C

下面是在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。

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

/* 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

#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.o

TestJNI.o:TestJNI.c TestJNI.h

gcc -Wall -c TestJNI.c -I./ -I/home/abc/jdk1.7/include -I/home/abc/jdk1.7/include/linux

cl:

rm -rf *.o *.so 格式如下:                 一个 makefile 主要含有一系列的规则,如下:                 A: B                 (tab)                 (tab)                                  每个命令行前都必须有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.youkuaiyun.com/kangkanglou/article/details/5807787 思考若是java文件带有包路径呢?可以去动手做做

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值