linux java 调用so_linux下java调用.so文件的方法1: JNI

本文介绍了如何使用Java的JNI技术在Linux环境下调用本地.so动态库。通过创建Java类,定义native方法,使用javah生成头文件,编写C代码实现方法,编译生成.so文件,并设置LD_LIBRARY_PATH环境变量来运行Java程序,成功调用.so库并传递参数。
摘要由CSDN通过智能技术生成

摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/

https://my.oschina.net/simaben/blog/322850

linux下java调用.so文件的方法1

刚刚试过一个这样的例子,省事起见,略改并记录如下:

//package net.wangliping;

2 public class Hello

3 {

4     static

5     {

6

7         System.loadLibrary("goodluck");

8     }

9

10     public native static int get();

11     public native static void set(int i,String s);

12

13     public static void main(String[] args)

14     {

15         try{

16         Hello test = new Hello();

17         test.set(10,"5555");

18         System.out.println(test.get());

19         }catch(Exception ex)

20         {

21           System.out.println("ssssss");

22         }

23     }

24 }

OK java类有了。

下面javac Hello.java

然后再javah Hello

生成了Hello.h

然后编写Hello.c

1 #include "Hello.h"

2

3 int i = 0;

4

5 JNIEXPORT jint JNICALL Java_Hello_get(JNIEnv *env, jclass jc)

6 {

7     return i;

8 }

9

10 JNIEXPORT void JNICALL Java_Hello_set(JNIEnv *env, jclass jc,jint j,jstring s)

11 {

13         char * tsetstr=(char*)(*env)->GetStringUTFChars(env, s, NULL);//注意此处jstring和char *的转换

14         printf("%s--------\n",tsetstr);

15     i = j;

16 }

保存,然后执行如下编译指令:

1 gcc -fPIC -D_REENTRANT -I/usr/java/jdk1.6.0_31/include -I/usr/java/jdk1.6.0_31/include/linux -c Hello.c

2 gcc -shared Hello.o -o libgoodluck.so

此时就生成了libgoodluck.so

注意为了让java找到此so,运行:export LD_LIBRARY_PATH=.,将当前目录加入此环境变量。

然后运行java Hello,好屏幕上打出了10.

然后测试下传入String型的参数,对应的jni定义应为jstring,但却出了些问题,在显示结果时仿佛内存溢出的样子。

后来查了查,需对jstring和char *作一个转换,如代码中所示,然后结果就正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值