iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >android 调用JNI SO动态库的方法
  • 509
分享到

android 调用JNI SO动态库的方法

2024-04-02 19:04:59 509人浏览 独家记忆
摘要

总结一下: Android 调用JNI 分为静态调用与动态调用(不论动态还是静态前提都是NDK环境已经配置好的前提下) 一、静态主要就是将c(.c)或者c++(cpp)的源文件直接加

总结一下:

Android 调用JNI 分为静态调用与动态调用(不论动态还是静态前提都是NDK环境已经配置好的前提下)

一、静态主要就是将c(.c)或者c++(cpp)的源文件直接加到项目中进行调用,

然后在CMakeLists.txt中进行配置。

 二、动态调用

1、动态调用使用已经编译好的动态库.so文件

 2、android调用ndk类

生成后的so文件


public class SerialPort {

p
*/
public static native int GetSOVer(String ar);

static {
System.loadLibrary("serialport");//初始化so库(注意这里添加是需要去掉lib与.so)

}
}

3、.c文件添加



#include <jni.h>
#include <termiOS.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include "M1900_drv.h"
#include "SerialPort.h"
#include "include/tinyalsa/audio_i2s.h"
#include "include/tinyalsa/asoundlib.h"
#include "android/log.h"
#include "newland_linux_so.h"
 
static const char *TAG = "serial_port";
#define LOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO,  TAG, fmt, ##args)
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, TAG, fmt, ##args)
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args)
 
//测试  Java_(固定)_com_littt_util_SerialPort(android包名原来的.更改为_,string ar 传入的字符串参数,JNIEnv *env, jclass固定写法)
JNIEXPORT jint JNICALL 
Java_com_littt_util_SerialPort_GetSOVer(JNIEnv *env, jclass clazz, jstring ar) {
	// TODO: implement GetSOVer()
	return 9;//返回一个9的值
}

4、.h头文件中声明



#include <jni.h>

#ifndef _Included_android_serialport_api_SerialPort
#define _Included_android_serialport_api_SerialPort
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL
Java_com_littt_util_SerialPort_GetSOVer(JNIEnv *env, jclass clazz,jstring v);
#ifdef __cplusplus
}
#endif
#endif

 5、头文件与c文件写好了,就需要在CMake 中添加.c与.h都需要添加


# 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.
 
add_library( # Sets the name of the library.
        serialport
 
        # Sets the library as a shared library.
        SHARED
 
        # Provides a relative path to your source file(s).
        M1900_drv.c
        M1900_drv.h
        audio_i2s.c
       linux_so.cpp
        mixer.c
        
        include/tinyalsa/asoundlib.h
        include/tinyalsa/audio_i2s.h
        )
 
# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.
 
find_library( # Sets the name of the path variable.
        log-lib
 
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)
 
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.
 
target_link_libraries( # Specifies the target library.
        serialport
 
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})
 
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")

6、在build.gradle同样需要配置


plugins {
    id 'com.android.application'
}
 
android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"
 
    defaultConfig {
        applicationId "com.littt.interphone"
        minSdkVersion 17
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
 
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        // cmake
        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
            }
        }
 
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
 
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
 
    ndkVersion '22.1.7171670'
}
dependencies {
//    implementation 'androidx.appcompat:appcompat:1.2.0'
//    implementation 'com.Google.android.material:material:1.2.1'
  
}

7、如果静态调用可以成功,那么就可以生成动态so库文件

 

点击图中锤子会进行编译。完成后可以打开如下路径查看 

红框中生成后 so文件

7.1、生成的.so文件(工程文件夹模式)目录为app/build/intermediates/ndk/lib,将其复制到另一个工程的app/lib目录下。

7.2、要使用上述的.so文件 ,必须将工程的包名改为生成.so文件时的包名,要不然 编译能通过,但是app不能正常运行。loGCat会提示找不到所调用函数的实现。

7.3、将so文件复制到需要的路径下。
7.4、在gradle.properties中最后加一行:android.useDeprecatedNdk=true。

到此这篇关于android 调用JNI SO动态库的文章就介绍到这了,更多相关android 调用JNI SO动态库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: android 调用JNI SO动态库的方法

本文链接: https://www.lsjlt.com/news/156343.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android 调用JNI SO动态库的方法
    总结一下: android 调用JNI 分为静态调用与动态调用(不论动态还是静态前提都是NDK环境已经配置好的前提下) 一、静态主要就是将c(.c)或者c++(cpp)的源文件直接加...
    99+
    2024-04-02
  • android调用JNI SO动态库的方法是什么
    这篇文章主要介绍“android调用JNI SO动态库的方法是什么”,在日常操作中,相信很多人在android调用JNI SO动态库的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”android调用...
    99+
    2023-06-25
  • Android 项目调用第三方库so动态库
    在Android NDK开发中,可以通过自己编写C/C++代码来构建so动态库进行调用之外,还可以把so动态库提供给第三方使用;接下来,我将介绍在新创建的Android 项目(或已存在的Android 项目)中如何调用第三方so动态库。 关...
    99+
    2023-08-31
    android android studio
  • Android so库开发——Android Studio调用so库(二)
    一、JNI规范so库调用         在 Android Studio生成自己的so库 中已经创建了自己的so库,这是一个JNI规范的so库,可以直接将so库放到libs中,并按照上面文章中MainActivity中的调用方法使用。 b...
    99+
    2023-09-25
    android studio android
  • 利用android studio 生成 JNI需要的动态库so文件 图文详解
    一、环境搭建 1.1 Android studio2021.2.1安装 到官网下载,此处不再陈述 1.2 JNI安装 JNI 是JDK里的内容,电脑上正确安装并配置JDK即可。 1.3 NDK安装 直接在Android studio下载(F...
    99+
    2023-09-12
    ndk-build cmake jni ndk so库文件
  • android jni调用的方法是什么
    在Android中,JNI(Java Native Interface)是一种机制,用于在Java和本地代码(如C/C++)之间进行...
    99+
    2023-09-20
    android
  • Android基础——动态加载so库
    Android中动态加载so 原因:如果把so文件直接放在libs目录下,在android程序启动的时候会默认加载libs目录下的所有so库,但这些so库可能会在某些地方存在冲突,使用动态加载so库,就可以通过一些条件判断是否要加载这个so...
    99+
    2023-08-17
    android java android studio
  • Android Studio应用中的so库怎么利用JNI生成
    这篇文章给大家介绍Android Studio应用中的so库怎么利用JNI生成,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.新建Android studio工程2.新建class:AppKey.java.主要为了保...
    99+
    2023-05-31
    android studio so库 jni
  • linux加载动态库.so的3种方法
            昨天同事联系我,他部署新版本的MS软件提示找不到动态库。但是他能找到这个动态库文件,但不知道如何加载。这样的问题对于我来说是个再简单不过的问题,但对于一个新手,可能就是个打破头都不知道如何解决的问题。所以我想对这个简单问题,...
    99+
    2023-08-31
    linux 运维 服务器
  • Android渗透测试12:IDA动态调试so
    0x00 前言 上一篇分享了使用 Android studio 和 Jeb 对 Apk 文件直接进行动态调试,本文将分享使用 IDA pro 调试 so 。 调试的 apk 文件还是使用 C...
    99+
    2023-10-20
    android android studio ide
  • Android Studio中如何实现导入JNI生成的.so库
    这篇文章主要讲解了Android Studio中如何实现导入JNI生成的.so库,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。由于在原来的ADT的Eclipse环境中,用ndk_build工具生成了相应的各个....
    99+
    2023-05-30
    android jni roi
  • C++调用动态库和Python调用C++动态库的方法是什么
    这篇文章主要介绍“C++调用动态库和Python调用C++动态库的方法是什么”,在日常操作中,相信很多人在C++调用动态库和Python调用C++动态库的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-05
  • Android studio中JNI编程实例并生成so库的示例分析
    这篇文章主要为大家展示了“Android studio中JNI编程实例并生成so库的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android studio中JNI编程实例并生成so库...
    99+
    2023-05-30
    android studio
  • C++调用动态库两种方式和Python调用C++动态库
    创建动态库动态库是在程序运行时加载的库文件,并不占用程序本身大小。选择动态库项目:新建.h和.cpp文件:# cat.h #pragma once extern "C" _declspec(dllexport) int sum(int a,...
    99+
    2023-05-14
    Python C++ 动态库
  • Android Studio 进行NDK开发,实现JNI,以及编写C++与Java交互(Java调用本地函数)并编译出本地so动态库
    1.首先认识一下NDK。 (1)什么是NDK? NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(...
    99+
    2023-09-29
    java android studio c++
  • golang 动态调用方法
    Golang是一门非常强大的语言,可以用于构建各种类型的应用,从命令行工具到Web应用和分布式系统,甚至还可以用于机器学习和数据科学等领域。在Golang中,可以通过反射来动态地调用方法。反射是一种能够在运行时检查程序类型、变量类型和方法的...
    99+
    2023-05-14
  • Qt之调用C#的动态库的解决方法
    环境:VS2019+Qt5.12 1. CLR库安装         首先,如果你VS2019没有安装...
    99+
    2024-04-02
  • Android JNI c/c++调用java的实例
    Android JNI c/c++调用java的实例近期通过研究SDL源码 得出Android JNI  c/c++调用Java 无需新建虚拟机,这样省去很多步骤,这样调用Android JNI会变得非常容易,大家看下简单实例:具...
    99+
    2023-05-31
    android jni java
  • 在动态库中调用外部函数的方法
    本篇内容介绍了“在动态库中调用外部函数的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!愉快的玩耍比如:...
    99+
    2024-04-02
  • C#调用动态库
    一、引言 “为什么我们需要掌握互操作技术的呢?” 对于这个问题的解释就是——掌握了.NET平台下的互操作性技术可以帮助我们在.NET中...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作