linux下java调用.so文件的方法1: JNI
2016-11-28 14:52
567 查看
摘自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 *作一个转换,如代码中所示,然后结果就正常。
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 *作一个转换,如代码中所示,然后结果就正常。
相关文章推荐
- linux下java jni调用.so文件的方法
- JNA—JNI终结者,java调用dll、ocx、so最简单的方法
- Windows环境下教你用Eclipse ADT 插件生成.h/.so文件,Java下调用JNI,轻松学习JNI
- JNI 使用总结 (JAVA 调用C语言编写的DLL/SO/SL文件)
- Linux平台使用JNI的例子 Java调用so
- java开发第一个JNI示例程序(基于linux操作系统)--java调用native方法
- JNA—JNI终结者,java调用dll、ocx、so最简单的方法
- Windows环境下教你用Eclipse ADT 插件生成.h/.so文件,Java下调用JNI,轻松学习JNI
- Android使用JNI生成.so文件并调用(使用传统生成.h的方法)
- Android使用JNI生成.so文件并调用(使用CMake的方法)
- jni中调用java方法获取当前apk的签名文件md5值
- jni中调用java方法获取当前apk的签名文件md5值
- Java在linux下调用C/C++生成的so文件
- java开发第二个jni示例程序(基于linux操作系统)--native层调用java方法
- 关于JNI的使用(实战linux平台下java调用本地c语言方法)
- JNA—JNI终结者,java调用dll、ocx、so最简单的方法
- Java在linux下调用C/C++生成的so文件
- Java框架JNA调用C方法(windows链接库dll文件、linux链接库so文件)
- 实践Java中,Jni调用DLL文件本地方法
- Linux下编写Lua扩展so文件和调用方法实例