我的测试过程,请参考。
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
相关推荐
liunx opencv java320.so System.getProperty("java.library.path") 获取到library路径然后把so文件放到该目录下
在本压缩包中,我们有两个关键文件:"libopencv_java3411.so" 和 "opencv-3411.jar",它们是专门为Java开发者在Linux环境下使用OpenCV3.4.11版本设计的。 首先,`libopencv_java3411.so` 是一个动态链接库文件,它...
总结来说,Java调用C动态SO文件的接口,主要是通过JNI机制实现的,涉及Java端的本地方法声明、C/C++代码实现、动态库加载和调用等步骤。这个过程需要对Java、C/C++以及JNI规范有深入理解,以确保跨语言交互的正确性...
2. 目标项目的Java代码中,同样需要`System.loadLibrary()`加载.so文件,并可以调用其中的方法。 总结: 通过以上步骤,我们成功地在Android Studio中创建了一个包含本地方法的.so文件,并将其引入到其他项目中。...
下面我们将深入探讨JNA的工作原理、使用步骤以及如何处理.dll和.so文件。 1. **JNA工作原理**: JNA通过映射本地函数到Java方法来实现调用。它有一个内存管理机制,可以自动转换Java数据类型到本地平台的数据类型...
标题中的“JNI基础实验一:调用.so文件--友善之臂Tiny210 android 串口/pwm/ADC/LED”表明这是一个关于Android应用程序开发的教程,特别关注JNI(Java Native Interface)的使用,以及如何在Android设备上操作硬件...
而`opencv-java480.jar`是Java类库文件,包含了Java版本的OpenCVAPI,使得开发者可以在Java程序中调用OpenCV的函数。 在64位Windows系统上,必须使用对应的64位版本`dll`文件,因为32位和64位的库不能混用。确保`...
涉及文件: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...
这个库文件使得Java程序能够调用OpenCV的底层功能,提供高性能的图像处理和计算机视觉操作。 `opencv.jar`则是OpenCV的Java绑定,包含Java API,使得开发者可以使用Java语言来访问和控制OpenCV的功能。它包含了必要...
Java程序通过JNI(Java Native Interface)与这个.so文件交互,允许Java代码调用C++库的函数,从而充分利用OpenCV的性能。 在人工智能领域,OpenCV广泛应用于图像识别、物体检测、图像分割、视频分析等多个方面。...
6. **在Java代码中调用**:在Android应用的Java代码中,通过`System.loadLibrary("tess")`加载.so文件,然后就可以使用预先定义好的本地方法。 这个压缩包中的“libs”目录很可能包含了上述各个CPU架构的.so文件。...
opencv 470版本java语言依赖库 linux环境so文件
《ArcGIS for Android(armeabi armeabi-v7a)libruntimecore_java.so:核心运行时库解析》 ArcGIS是Esri公司开发的一套全面的地理信息系统,它提供了地图制作、地理分析、空间数据管理和应用程序开发等功能。在...
Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 Android 项目中调用.so 动态库中的 ...
这些文件包含了运行时程序需要调用的函数和数据,使得开发者无需将所有代码都编译进应用程序,从而减小了程序的大小并提高了性能。 在描述中提到,这个打包合集是为了方便开发人员快速进行OpenCV相关的项目开发。...
Java在Linux环境中调用SAP RFC接口涉及到的关键技术点包括Java与SAP的集成、Linux系统下的动态链接库(.so文件)以及SAP的RFC(远程功能调用)技术。这里将详细介绍这些知识点。 首先,SAP RFC是SAP提供的一种通信...
这个包中的`opencv-454.jar`文件是Java版的OpenCV库,它允许Java开发者直接在Java代码中调用OpenCV的功能,从而无需关心底层的C++实现细节。 其次,`libopencv_java454.so`是一个动态链接库文件,它是OpenCV与Java...
在Linux系统(这里是CentOS 7.2)中,这种.so文件是系统调用库的二进制形式。JNI是Java平台的一个标准部分,允许Java代码和其他语言写的代码交互。在这个例子中,JNI使得Java代码能够调用C++实现的OpenCV功能,通过...
假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...
Tess4J是一个Java封装的Tesseract API,使得Java开发者可以方便地调用Tesseract的功能,实现OCR识别。 回到问题本身,当开发者在64位系统上工作时,下载的"libtesseract.so"可能默认为64位版本,这在32位系统上无法...