`

java 调用 .so 文件

 
阅读更多

我的测试过程,请参考。
Java代码(Test.java):

Java code?
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)

C/C++ code?
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)

C/C++ code?
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

分享到:
评论

相关推荐

    linux opencvjava320.so

    liunx opencv java320.so System.getProperty("java.library.path") 获取到library路径然后把so文件放到该目录下

    libopencv_java3411.so+opencv-3411.jar

    在本压缩包中,我们有两个关键文件:"libopencv_java3411.so" 和 "opencv-3411.jar",它们是专门为Java开发者在Linux环境下使用OpenCV3.4.11版本设计的。 首先,`libopencv_java3411.so` 是一个动态链接库文件,它...

    Java调用C(动态SO文件)接口

    总结来说,Java调用C动态SO文件的接口,主要是通过JNI机制实现的,涉及Java端的本地方法声明、C/C++代码实现、动态库加载和调用等步骤。这个过程需要对Java、C/C++以及JNI规范有深入理解,以确保跨语言交互的正确性...

    as生成.so文件,并引用到其它项目中进行调用

    2. 目标项目的Java代码中,同样需要`System.loadLibrary()`加载.so文件,并可以调用其中的方法。 总结: 通过以上步骤,我们成功地在Android Studio中创建了一个包含本地方法的.so文件,并将其引入到其他项目中。...

    JNA调用.dll文件或.so动态链接库的代码demo

    下面我们将深入探讨JNA的工作原理、使用步骤以及如何处理.dll和.so文件。 1. **JNA工作原理**: JNA通过映射本地函数到Java方法来实现调用。它有一个内存管理机制,可以自动转换Java数据类型到本地平台的数据类型...

    opencv-java480.dll windows 64 opencv-java480.jar下载

    而`opencv-java480.jar`是Java类库文件,包含了Java版本的OpenCVAPI,使得开发者可以在Java程序中调用OpenCV的函数。 在64位Windows系统上,必须使用对应的64位版本`dll`文件,因为32位和64位的库不能混用。确保`...

    JNI基础实验一:调用.so文件--友善之臂Tiny210 android 串口/pwm/ADC/LED

    标题中的“JNI基础实验一:调用.so文件--友善之臂Tiny210 android 串口/pwm/ADC/LED”表明这是一个关于Android应用程序开发的教程,特别关注JNI(Java Native Interface)的使用,以及如何在Android设备上操作硬件...

    linux jnative 调用.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...

    opencv-4.5.5编译后的jar包和linux平台的so文件

    Java程序通过JNI(Java Native Interface)与这个.so文件交互,允许Java代码调用C++库的函数,从而充分利用OpenCV的性能。 在人工智能领域,OpenCV广泛应用于图像识别、物体检测、图像分割、视频分析等多个方面。...

    Tess-two编译可用.so文件 2018

    6. **在Java代码中调用**:在Android应用的Java代码中,通过`System.loadLibrary("tess")`加载.so文件,然后就可以使用预先定义好的本地方法。 这个压缩包中的“libs”目录很可能包含了上述各个CPU架构的.so文件。...

    opencv 470版本java语言依赖库 linux环境so文件

    opencv 470版本java语言依赖库 linux环境so文件

    arcgis for android(armeabi armeabi-v7a) libruntimecore_java.so

    《ArcGIS for Android(armeabi armeabi-v7a)libruntimecore_java.so:核心运行时库解析》 ArcGIS是Esri公司开发的一套全面的地理信息系统,它提供了地图制作、地理分析、空间数据管理和应用程序开发等功能。在...

    Android通过JNI调用.so动态库

    Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 Android 项目中调用.so 动态库中的 ...

    opencv-341.jar + libopencv_java341.so

    在Linux系统(这里是CentOS 7.2)中,这种.so文件是系统调用库的二进制形式。JNI是Java平台的一个标准部分,允许Java代码和其他语言写的代码交互。在这个例子中,JNI使得Java代码能够调用C++实现的OpenCV功能,通过...

    arm64位系统jdk1.8版opencv动态库opencv-454.jar和libopencv-java454.so

    这个包中的`opencv-454.jar`文件是Java版的OpenCV库,它允许Java开发者直接在Java代码中调用OpenCV的功能,从而无需关心底层的C++实现细节。 其次,`libopencv_java454.so`是一个动态链接库文件,它是OpenCV与Java...

    JNI--java调用不同平台的动态链接库,dll,so,完美,全教程

    假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...

    opencv_java.so+opencv.jar

    这个库文件使得Java程序能够调用OpenCV的底层功能,提供高性能的图像处理和计算机视觉操作。 `opencv.jar`则是OpenCV的Java绑定,包含Java API,使得开发者可以使用Java语言来访问和控制OpenCV的功能。它包含了必要...

    编译so文件 Unity调用so文件样例

    总结,制作和在Unity中调用SO文件的关键在于理解JNI接口的设计,正确配置C/C++编译环境,以及在Unity中适当地引入和调用SO文件。这个过程涉及到Android NDK开发、JNI编程以及Unity的插件集成,需要对这几个方面都有...

    liblept.so和libtesseract.so文件(32位和64位)

    Tess4J是一个Java封装的Tesseract API,使得Java开发者可以方便地调用Tesseract的功能,实现OCR识别。 回到问题本身,当开发者在64位系统上工作时,下载的"libtesseract.so"可能默认为64位版本,这在32位系统上无法...

    arm64下的libopencv*.so+libopencv*.so.3.2文件

    这些文件包含了运行时程序需要调用的函数和数据,使得开发者无需将所有代码都编译进应用程序,从而减小了程序的大小并提高了性能。 在描述中提到,这个打包合集是为了方便开发人员快速进行OpenCV相关的项目开发。...

Global site tag (gtag.js) - Google Analytics