我的测试过程,请参考。
Java代码(Test.java):
1
2
3
4
5
6
7
8
9
10
11
12
|
class Test {
static {
System.load( "/lib/libtestjni.so" );
}
public static native int get();
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.get());
}
} |
调用javah生成的C头文件(Test.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Test */ #ifndef _Included_Test #define _Included_Test #ifdef __cplusplus extern "C" {
#endif /* * Class: Test
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_Test_get (JNIEnv *, jclass);
#ifdef __cplusplus } #endif #endif |
自定义的C源程序(Test.c)
1
2
3
4
5
6
7
8
9
10
11
|
#include<dlfcn.h> #include<stdio.h> #include<stdlib.h> #include "Test.h" JNIEXPORT jint JNICALL Java_Test_get (JNIEnv* env, jobject obj) {
return 10;
} |
我使用的是OpenJDK 6.0,使用以下命令编译Test.c,生成Test.o
gcc -Wall -c -o Test.o Test.c -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux
查看Test.o的内容,使用以下命令
nm Test.o
看到的内容如下:
00000000 T Java_Test_get
用以下命令生成so文件
gcc -Wall -rdynamic -shared -o libtestjni.so Test.o
查看libtestjni.so的内容,使用以下命令
nm libtestjni.so
看到的内容如下:
000003ec T Java_Test_get
00001f20 a _DYNAMIC
00001ff4 a _GLOBAL_OFFSET_TABLE_
w _Jv_RegisterClasses
00001f10 d __CTOR_END__
00001f0c d __CTOR_LIST__
00001f18 d __DTOR_END__
00001f14 d __DTOR_LIST__
00000454 r __FRAME_END__
00001f1c d __JCR_END__
00001f1c d __JCR_LIST__
0000200c A __bss_start
w __cxa_finalize@@GLIBC_2.1.3
00000400 t __do_global_ctors_aux
00000330 t __do_global_dtors_aux
00002008 d __dso_handle
w __gmon_start__
000003e7 t __i686.get_pc_thunk.bx
0000200c A _edata
00002014 A _end
00000438 T _fini
000002cc T _init
0000200c b completed.6625
00002010 b dtor_idx.6627
000003b0 t frame_dummy
将libtestjni.so拷贝到/lib/
sudo cp libtestjni.so /lib
调用Test.class
java Test
看到的内容是
10
相关推荐
描述java与C之间如何互串,如何.......
假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...
这个是使用JNA调用.dll文件或.so文件动态链接库的例子
涉及文件:so_test.h test_a.c test_b.c test_c.c 终端执行命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 将编译得到到libtest.so拷贝到/usr/lib/,同时执行chmod 555 libtest.so 2.qt...
linux下java调用opencv的独立库文件.包含 opencv-454.jar libopencv_java454.so
springboot+jna/jni调用动态so/dll库
ndk生成.so文件的Demo,生成.so文件如有问题查看csnd中有关于ndk开发的文章 https://blog.csdn.net/qq_35352552/article/details/80902643
使用cywin将C++代码编译成.so文件,android动态调用。源文件包括C++源码,android所有代码,在android2.2上可以运行。
springboot环境下java调用c程序生成动态链接库(.so文件),并调用(基于JNI,Ubuntu) ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业...
RaspberryPi树莓派处理器使用的是ARM架构,而一般电脑则为x86或x64架构,均不能适用,故只能在系统中重新编译安装RXTX源码,此so文件为在arm架构的树莓派编译制作的文件,直接放在jre目录即可运行
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式 )。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各...
SerialPort Android串口开发.so文件和java调用.so类
参考网上一些资料,实现了通过JNI调用第三方动态库.so,个人觉得重点在Make文件改写,例外注意确保程序完全正确,我开始就是程序中个字母写错而浪费了好多时间。
JPcap移植到Android平台,这是编译后的库文件,在Android项目中可通过JPcap中的Java接口对之进行调用。
Java调用C(动态SO文件)接口开发说明书.doc
完整演示使用JNI开发JAVA和C++交互的例子,本示例提供了在Windows和linux上的编译脚本。请参考JNI的相关文章,如有疑问可留言
这个示例分步骤实现了: 1. java调用.so文件 2. 显示char数组的字符串 3. 不同进制显示char数组 4. java调用so从本地返回char数组 5. java传递char数组给so,然后so修改后再返回char数组给java
实现了java-c的互调 1.hello-jin-c是linux下的c...(使用NDK编译成.so文件,供java层调用)。 2.helloJni是java工程。(里面通过JNI调用下面.so中提供的c的实现。) 同理.so里面也可以调用回调java里面实现的文件。
一、windows 环境设置 1.sapjco3.dll 需要与 sapjco3.jar 在同一目录 2.设置系统环境变量,将sapjco3所在目录加入系统环境变量 ...2.将 libsapjco3.so 文件复制至 $JAVA_HOME/jre/lib/amd64/server/libsapjco3.so
linux 环境下java调c++生成的so库,对应博客地址: http://blog.csdn.net/woniu211111/article/details/78041868