编译生成.so文件

一、使用makefile生成.so文件 -----查找发现makefile编译动态库时,找不到链接符号也是允许编译通过的,那最好是加上限制条件,在makefile加上 -Xlinker –unresolved-symbols=ignore-in-shared-libs ,让其报错,把未定义的符号给报错出来。这里先将所有.c 文件编译为 .o 文件,这样后面更改某个 .c 文件时,其他的 .c 文件将不在编译,而只是编译有更改的 .c 文件,可以大大提高大项目中的编译速度。链接时,未增加-L 路径依赖,-l 库依赖。 阅读详情

1.新建带c++支持的Android工程。demo编译运行无误

2.在CMakeLists.txt中添加,生成.so文件可以拷贝出去供其他工程使用

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#设置生成的so动态库最后输出的路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

#在add_library之前设置
add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             native-lib.cpp )

3.动态注册native方法名称,这样可以注册其他工程的包路径

采用RegisterNatives的注册jni的方法不需要javah命名生成的jni规则函数的命名方式

RegisterNatives为JNIEnv的成员函数,声明为:
    jint (JNICALL *RegisterNatives) (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,jint nMethods);

其对应的取消注册的函数为声明为:
    jint (JNICALL *UnregisterNatives) (JNIEnv *env, jclass clazz);

在java中调用System.loadLibrary("somelib");的时候,系统会自动调用jni的函数JNI_OnLoad,
在程序退出的时候,系统卸载“somelib”,会自动调用jni的函数JNI_OnUnload,
所以我们需要在jni的接口文件中重写这两个函数

 

 

例子如下:

// native方法
static jstring JNICALL native_get_String(JNIEnv *env, jobject obj, jobject content) {

}

//先定义一个字符串,内容为类名
const char* JNIT_CLASS = "com/mobile/encrypt/api/whitebox/EncryptUtils";

/**
 * 注册的native调用的方法
 */
static const JNINativeMethod gMethods[] = {
        {"stringFromJNI",  "(Landroid/content/Context;)Ljava/lang/String;", (jstring *) native_get_String}
};

/**
 * 注册方法到JVM中
 * System.loadLibrary会自动调用JNI_OnLoad,在此进行动态注册
 *
 * @param jvm
 * @param reserved
 * @return
 */
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
    // 防止动态调试
    ptrace(PTRACE_TRACEME, 0, 0, 0);

    JNIEnv *env = NULL;//注册时在JNIEnv中实现的,所以必须首先获取它
    jint result = JNI_FALSE;

    //获取env指针
    if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {//从JavaVM获取JNIEnv,使用1.6的版本
        return result;
    }

    //获取类引用,写类的全路径(包名+类名)
    jclass clazz = env->FindClass(JNIT_CLASS);
    if (clazz == NULL) {
        return result;
    }

    //注册方法
    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
        return result;
    }
    //成功
    result = JNI_VERSION_1_6;
    return result;
}

JNIEXPORT void JNICALL
JNI_OnUnLoad(JavaVM *jvm, void *reserved){
    JNIEnv *env = NULL;
    //获取env指针
    if (jvm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {//从JavaVM获取JNIEnv,使用1.6的版本
        return result;
    }

    //获取类引用,写类的全路径(包名+类名)
    jclass clazz = env->FindClass(JNIT_CLASS);
    if (clazz == NULL) {
        return result;
    }
    jint nRes = env->UnregisterNatives(cls clazz);
    return;
}

说明:

定义的JNIT_CLASS表示的是要调用的jni的java类的名称

gMethods[]为RegisterNatives的第三个函数,表示的是所有jni的函数的集合。

JNINativeMethod是表示jni的方法的结构体,具体结构如下

typedef struct{
    char *name;
    char *signature;
    void *fnPtr;
} JNINativeMethod;

name:为Java类中的native函数的名称
signature:为Java类中的native函数的Java类型描述
fnPtr为jni中对应的函数名称,格式为类似(void*)MethodName

函数和变量的java类型描述可以通过命令 javap -s -p classname来获得,classname与使用javah时写的名称一致,javah生成的头文件的每个函数的注释中也有这个描述

对于“()Ljava/lang/String;”一个描述,表示该函数没有参数,返回值为String。括号内的是参数列表,后面跟的是返回值

java中简单类型和jni中的描述的对应关系如下表所示:

Field Descriptor	Java Language Type
Z	                boolean
B	                byte
C	                char
S	                short
I	                int
J	                long
F	                float
D	                double
 

对于复杂类型,字符串描述以“L”开头,以“;”结束,例如java中的 String ,在jni中的描述为"Ljava/lang/String;"

对于数组,以“[”开头,接类型描述,例如int[ ],在jni中的描述为“[I”;String[ ], 对应为“[Ljava/lang/String;”;如果是数组维数增加一维,则"["增加一个,例如int[ ][ ],对应为“[[I”;

4.获取方法签名,在build的 /build/intermediates/classes/debug/目录下获取定义native方法名称工具类的class文件。使用javap -s  xxx.class获取方法签名

5.CMakeLists.txt添加多c++源文件

6.gradle配置

 

 

 

重温android studio jni编译生成so文件 步骤: 1、创建一个android工程 2、编译工程,Buiid->Make Project生成class文件 3、配置NDK 4、创建一个NdkUtil类 5、创建main.c和一个空的c文件empty.c 6、编译工程,生成so文件 7、复制so文件到jniLibs下 8、完成 具体实现: 1、创建一个android工程(这个就不废话了) 2、编译工程,Bui 阅读详情

相关推荐

Android 使用 FFmpeg (一)——编译生成.so文件

在android 中如何使用FFmpeg第一步——在Linux环境下编译.so文件

一点一刻 1万+

gcc生成静态库.a和动态库.so

请说明可执行程序是如何被组装的? 1)阅读、理解和学习材料“用gcc生成静态库和动态库.pdf”和“静态库.a与.so库文件的生成与使用.pdf”,请在Linux系统(Ubuntu)下如实仿做一遍。 2)在第一次作业的程序代码基础进行改编,除了x2x函数之外,再扩展写一个x2y函数(功能自定),main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 mai.

Harriet的博客 3720

编译HAL层生成lib.so文件

本文以编译LCD背光的库文件为例,生成的库文件为 lights.mini6410.so. 源文件的目录为:Android-2.3.4/device/samsung/crespo/liblight/    light.c   Android.mk light.c /* * Copyright (C) 2008 The Android Open Source Project * *

zlcchina的专栏 2738

.so文件的生成和使用

简介: 在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。 在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少。在/lib目录下,就有许多以.so作后缀的文件,这就是LINUX系

u013590327的博客 6344

AndroidStudio 2.2.3:编译C++文件、生成so文件及so文件使用

本篇文章,主要参考AndroidStudio 编译C/C++文件生成SO文件,但是在学习过程中还是出现了不少问题,所以详细记录一下操作过程。 一、AndroidStudio的NDK下载: 通过file----->settings进行下载: 二、新建一个Project: 1、一定要勾选C++这个方框; 2、一直“下一步”即可,在最后含有C++选项时,可勾选下

xiangdengbin的博客 4243

在WIndow下安装好MSYS之后如何编译FFmpeg文件使之生成.so文件

在WIndow下安装好MSYS之后如何编译FFmpeg文件使之生成.so文件 在此小记下,以免又忘了,不知去哪儿找了。 首先要确保编译FFmpeg环境已经搭好可用了。这可是要费点功夫。 若没搭建好可以参考如下牛人网站跟着他一步步走,到11步时基本环境已经搭建好了。 http://jeremiah.blog.51cto.com/539865/126804 其次要确保安装了NDK,没的话

Sunnyfans的专栏 2163

Android Studio 编译C/C++生成.so文件

NDK

qq_45661948的博客 7364

从Simulink到Veristand:模型编译与SO文件生成实战指南

本文详细介绍了将Simulink模型编译为Linux系统下SO文件,并集成到Veristand实时测试环境的完整实战流程。内容涵盖环境配置、模型编译关键设置、XML文件生成与配置,以及最终在HIL硬件在环测试中的部署与调试,旨在帮助工程师打通从模型设计到实时硬件测试的最后一公里。

palm99的专栏 719

Linux系统(Ubuntu)下利用gcc生成静态库.a与动态库.so文件

通过上面三个例子用gcc生成静态库.a和动态库.so的练习过程,本人能够基本上熟练的生成静态库和动态库。在两种库的比较中,能够明显看出两者的差别。在过程中也遇到一些问题,但是通过优快云查资料很快就找到了解决方法了。总的来说,本人通过跟着例程一步一步做,接触了gcc生成静态库与动态库的知识,学习并且理解与掌握了,自我会感觉不错!

m0_63323712的博客 2880

ADS与Cadence中Verilog-A文件的编译与调用实战指南

本文详细介绍了在ADS与Cadence平台中Verilog-A文件的编译与调用实战指南,涵盖开发环境配置、模型创建与编译、仿真设置技巧以及跨平台协作与调试等内容。通过具体案例和优化策略,帮助工程师高效完成混合信号仿真设计,提升电路建模与验证效率。

weixin_29196315的博客 496

Camera ITS测试

一、手机端设置: 将 CtsVerifier.apk 安装到设备上, 连接上linux主机。 二、主机端设置: 基础:CTS测试运行环境 然后,主机安装python2.7,及numpy/scipy/matplotlib/opencv 栈和 python 成像库。按照下面的命令依次安装: sudo apt­-get install python-­numpy sudo apt-­g...

wangubuntu的专栏 7784

LINUX下C++生成.so文件及编译生成可执行文件的过程

以下是.so库的生成及编译步骤: 如果.cpp文件不多的话,可以将.cpp和.hpp文件都放在一个目录下,依次输入名称进行编译.也可以用指令将整个目录下的.cpp文件全部编译.这里先记录下依次输入名称的方法. 1.对目录下不包含main函数的.cpp文件进行统一编译(必须将使用到的.hpp文件都放进来) 终端进入目录,输入以下命令 g++ ibeo_socket.cpp base64.cpp l...

RyIIm的博客 6069

重磅!Repo Wiki!

RepoWiki是Qoder平台的智能文档生成功能,通过静态代码分析自动提取项目架构、模块依赖和核心逻辑,并持续追踪代码变更保持文档同步。其工作流程分为四个阶段:1)代码扫描与AST解析;2)结构分析与依赖映射;3)文档智能生成;4)增量更新机制。支持多种编程语言,能识别设计模式并推断技术决策,适用于新项目搭建和遗留系统维护。优势在于降低理解成本和提高开发效率,但存在文件数量限制和依赖Git的局限性。典型应用场景包括自动生成架构图、API手册和团队知识沉淀。

ayusong870的博客 4023

AS编译c/c++生成so文件

本文讲如何用AndroidStudio生成SO文件 1.新建一个Android项目2.新建一个类,并添加native方法 3.生成class文件 执行Build->Make Project之后,会在项目的app\build\intermediates\classes\debug路径下发现编译成功的项目class文件 ,如下图: 4.打开as的命令终端,输入命令生成.h文件 输入cd a

zhanghua_ting的博客 5016

从零开始学 PyTorch 7天路线图(完整可运行代码版)

本文提供了5天PyTorch入门教程的完整代码,涵盖从基础到实战的核心内容。Day1测试环境并介绍张量基础;Day2讲解常用张量操作;Day3演示自动求导机制;Day4实现完整线性回归模型;Day5构建MNIST手写数字识别全连接网络。所有代码可直接运行,包含GPU检测、梯度计算、模型训练和可视化等关键环节,帮助新手快速掌握PyTorch核心概念和典型应用场景。

IT老农民的博客 314

RK3588&RK3576实现 HW-ID DTB(动态加载不同的Kernel DTB)功能

RK平台的U-Boot⽀持检测硬件上的GPIO或者ADC状态动态加载不同的Kernel DTB,暂称为HW-ID DTB(Hardware id DTB)功能。

Wynter 849

新手向:Android studio编译C文件生成SO文件

流程1.准备工作a.jdk和Android studio安装b.SDK配置c.NDK安装及配置2.创建Native C++工程3.创建新的Java类方法并生成对应.h文件4.编写mk文件和C/C++文件a.Android.mk编写b.Application.mk编写c.C/C++文件编写5.生成So文件 1.准备工作 a.jdk和Android studio安装 jdk下载网址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downl

weixin_41796275的博客 795

10、高阶ΣΔ调制器设计与优化

本文深入探讨了高阶ΣΔ调制器的设计与优化技术,重点介绍了NTF零点优化方法,通过分散单位圆上的零点分布提升信噪失真比(SQNR)。文章分析了量化噪声耦合技术如何有效提高噪声整形阶数,并对比了CIFB、CIFF、CRFB和CRFF等不同架构的性能特点。同时,详细阐述了基于稳定性与性能权衡的设计流程,结合Schreier的Delta-Sigma Toolbox实现NTF综合与仿真验证。内容涵盖从理论推导到实际设计步骤,为高阶ΣΔ调制器的稳定性提升与性能优化提供了系统性指导。

tgb345678的博客 134

eclipse用ndk编译生成.so文件

今天帮朋友搞了一天eclipse导入jni项目报错,之前一直以为是C文件写错了,后来发现是ndk一直配置不上,导致一个.so文件一直没生成,编译时找不到 网上Usb Audio项目导入出错 报错为: 03-27 12:18:41.591: E/AndroidRuntime(8831): FATAL EXCEPTION: main 03-27 12:18:41.591: E/Androi

ZhangQiang_0的博客 866

数仓建模:维度表合并时,如何处理可能出现的数据冲突?

通过以上方法,可以有效地处理维度表合并时可能出现的数据冲突,确保合并后的数据完整性、一致性和准确性,满足业务需求和数据仓库的性能要求。在合并过程中,需要根据实际情况选择合适的处理方法,并进行充分的测试和验证。(2)实战中总结的SQL技巧,帮助SQLBOY在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。技巧总结,让你认识不一样的数仓。,数据库会抛出异常,可根据异常处理机制解决。

石榴姐yyds 1132

【Yolo12改进策略】MRFA 小核协同,构建巨大的感受野,同时保持高斯型分布|即插即用|ICCV2025

本文将介绍如何将 UniConvNet 论文中的核心模块——感受野聚合器集成到 Yolo12中,通过一种新颖的“小核协同”范式,在不显著增加计算开销的前提下,显著提升模型的感受野质量和检测精度。在目标检测中,模型要识别一个物体,不仅需要看到物体的局部特征,更需要理解其周围的上下文信息。传统卷积网络通过堆叠小卷积核(如 3x3)来扩大“感受野”,但这个过程缓慢且效率低下。而近期流行的大核卷积,虽然感受野大,但会破坏“距离越近、影响越大”的自然分布,且带来巨大的计算负担。MRFA 找到了一条“中间道路”:它通过

m0_47867638的博客 929

AndroidNDK开发——使用Cmake编译生成so文件

可以看到项目demo成功运行,期前也遇到不少问题,so的加载和调用,jni初始化,数据传递等等,如果有兴趣的同学可以自己去试试,学到手的东西才是自己的。本文是以串口通信的so为例,所以里面的头文件及数据调用的方法都是在加载串口数据,不过我为了测试所以暂时只写了一个简单的,因为测试串口需要设备和串口通信助手,这里先不讲,后面有空会逐一讲解串口通信流程和实战demo.

u012556114的博客 3979

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android studio里面编译C文件生成so文件

刚开始接触安卓就遇到了编译c文件生成so文件的问题,在这里总结一下自己摸索了好久的经验 第一步 配置NDK 可以在tools-SDKmanager-android SDK -SDK Tools里面下载或者自己从网上下载 之后配置ndk的环境 如果安装顺利的话,在local.properities里面就有ndk的配置 第二部 进行JNI开发 首先建一个Java文件, Syst...

weixin_42676203的博客 5889

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Windows环境下编译Assimp库生成Android可用的.so文件

Windows环境下编译Assimp库生成Android可用的.so文件前言在做项目过程中需要使用Assimp这个3D模型读取库来读取obj格式的模型,因为项目是基于Android平台,采用NDK开发,所以就打算编译Assimp库并生成.so文件,由此掀开了一段痛苦的编译之旅。在真机测试可用的前提下,记录一下整个过程以及遇到的坑和解决办法。步骤1.下载并安装好最新版的Android Studio,在

骆小坑的填坑之旅 4860

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

多个cpp文件生成so_Android studio如何利用Android.mk编译生成多个so文件

我们这次不用gradle 去生成SO文件,改用Android.mk 去编译。一共分为2步:1.在Java中编写要调用的静态方法和需要加载的库,并生成头文件。2.配置gradle3.配置Android.mk文件和application.mk文件下面一步步的走:首先需要在Java类中声明要调用的方法,以及要加载的库,我们在包下新建一个jniUtil类,如下所示public class jniUtil ...

weixin_36064575的博客 808

java 生成 so_Eclipse下用NDK编译生成so文件

我们在安装环境的时候安装了NDK,可以在eclipse下直接生成so文件。NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录下即可。第一次生成so文件的时候,我们先使用NDK的sample下的hello-jni的例子。1、启动eclipse,通过Create project from existing source,选择hello-jni的目录,按默认选项创建工程即可;2...

weixin_42314648的博客 253
上一篇: 解决 AndroidStudio使用NDK报错显示mips64el-linux-android-strip'' 问题
下一篇: github问题记录
MatrixGame
博客等级 码龄9年 40粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatrixGame

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值