android studio通過 jni 調用第三方非標準 so庫

調用第三方的so方法,但這個so內的方法不是標準的jni方法。這就需要我們自己寫jni然后鏈接到第三方so庫,通過jni調用so庫中的方法。

1.簡述:

要先有第三方的so庫.so文件和編譯庫對應的.h頭文件

  • 我們自己用 c/c++ 創建一個標準的so 庫,比如 mynative.so
  • 然后用我們自己的mynative.so 庫中去調用第三方的libnative.so庫
  • 我們在上層 調用我們自己的mynativeso 庫 ,就實現了對第三方 libnativeso 庫 方法的調用。

2.先編譯出一個第三方非標準so庫

1).android studio 新創建一個項目

我們先制作一個非標準 jni 庫,只要功能實現兩個數相加 ,并返回相加后的結果。

2).main 新創建 jni 文件夾

3).新建 .cpp 文件和 .h 實現求和功能,并把文件放在jni目錄下

test.cpp

#include "test.h"
Add::Add(){}
Add::~Add(){}int Add::add(int x, int y){return x + y;
}

test.h

#ifndef _TEST_JNI_ADD_H_
#define _TEST_JNI_ADD_H_class Add{public :Add();~Add();int add(int x, int y);
};
#endif

4).編寫 CMakeLists.txt 用來編譯 cpp 文件為so庫,在 app文件下新建CMakeLists.txt 文件

#指定cmake最小版本
cmake_minimum_required(VERSION 3.4.1)#設置生成的so動態庫最后輸出的路徑
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})#生成so
add_library( # 設置生成庫的名字nativeso# 生成動態庫SHARED# 指定源碼文件,這里指定test.cpp文件src/main/jni/test.cpp )#依賴的頭文件
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/main/jni)
find_library( # log庫的別名log-lib#log庫log )#鏈接代碼到指定的庫
target_link_libraries( # Specifies the target library.nativeso# Links the target library to the log library# included in the NDK.${log-lib} )

5).配置項目的build.gradle

6).配置 gradle.properties

android.useDeprecatedNdk=true

7).編譯第三方非標準庫,直接運行即可。

3.新建項目引用第三方 so 庫

1)新建 android studio 項目
2)新建 java 類,封裝想要調用的接口函數
package com.example.demo05;public class JniCallNative {static {System.loadLibrary("mynativeso");}public static native  int  getAddFromNative(int a,int b);
}
3)Main 文件夾新建 jniLibs 文件夾,并拷貝第三方so到此文件夾下

4)創建 對應的 jni java 類文件的頭文件

在Termial控制臺中cd到項目目錄中的源碼目錄下,并執行命令生成.h文件

??javac?-encoding utf-8 -h .??JniCallNative.java

執行完成后,會在 java 目錄生成 對應 .h 文件

5) main 文件夾 下新建 jni文件夾,實現底層邏輯
  • 將上一步 生成 .h 文件 拷貝進來,以及第三方so提供的對應.h頭文件也要拷貝到jni目錄中
  • 根據.h 文件 編寫 對應的 .cpp 文件 ,在cpp 文件里實現對 第三方 so 庫 的引用
  • 自己實現的邏輯中調用第三方.h內容

jninative.cpp?文件


#include <jni.h>
#include <string>
#include <test.h>//導入需要的.h文件,這個是必須的,如果依賴的第三方庫沒有.h,需要自己編寫extern "C"
JNIEXPORT jint JNICALL Java_com_example_demo05_JniCallNative_getAddFromNative(JNIEnv *, jclass, jint a, jint b){//生成add對象并調用方法Add addObj;int result = addObj.add(a,b);return result;}
7) 編寫 自己 so 庫的 CMakeLists.txt 文件

app 文件下新建 CMakeLists.txt

#指定cmake最小版本
cmake_minimum_required(VERSION 3.4.1)
#設置生成的so動態庫最后輸出的路徑
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})#生成so
add_library( # 設置生成庫的名字mynativeso# 生成動態庫SHARED# 指定源碼文件,這里指定test.cpp文件src/main/jni/jninative.cpp )#依賴的頭文件
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/main/jni)#依賴的add庫
add_library(nativeso SHARED IMPORTED)
set_target_properties(nativesoPROPERTIES IMPORTED_LOCATION${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libnativeso.so)find_library( # log庫的別名log-lib#log庫log )#鏈接代碼到指定的庫
target_link_libraries( # Specifies the target library.mynativeso#add庫需要鏈接nativeso# Links the target library to the log library# included in the NDK.${log-lib} )

8) ?配置環境 build.gradle和?gradle.properties

9) 編譯自己的so庫,直接運行即可

10) 主函數調用測試

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>

package com.example.demo05;import android.os.Bundle;
import android.widget.TextView;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});TextView textView = findViewById(R.id.tv01);int addFromNative = JniCallNative.getAddFromNative(5, 5);textView.setText(addFromNative + "");}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71329.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71329.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71329.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring(三)容器-注入

一 自動注入Autowire 代碼實現&#xff1a; package org.example.spring01.service;import org.springframework.stereotype.Service;Service public class UserService {}package org.example.spring01.controller;import lombok.Data; import lombok.ToString; import org.…

mac上最好的Python開發環境之Anaconda+Pycharm

為了運行修改 label-studio項目源碼&#xff0c;又不想在windows上運行&#xff0c;便在mac上開始安裝&#xff0c;開始使用poetry安裝&#xff0c;各種報錯&#xff0c;不是zip包解壓不了&#xff0c;就是numpy編譯報錯&#xff0c;pipy.org訪問出錯。最后使用anaconda成功啟動…

IDEA 接入 Deepseek

在本篇文章中&#xff0c;我們將詳細介紹如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek&#xff0c;讓你的 AI 編程助手更智能&#xff0c;提高開發效率。 一、前置準備 在開始之前&#xff0c;請確保你已經具備以下條件&#xff1a; 安裝了 JetBrains IDEA&…

前綴和矩陣

前綴和矩陣&#xff08;Prefix Sum Matrix&#xff09;是一種預處理技術&#xff0c;用于快速計算二維矩陣中任意子矩陣的元素和。其核心思想是通過提前計算并存儲每個位置左上角所有元素的和&#xff0c;將子矩陣和的查詢時間從暴力計算的 (O(mn)) 優化到 (O(1))。以下是構建前…

系統架構評估中的重要概念

(1)敏感點(Sensitivity Point) 和權衡點 (Tradeoff Point)。敏感點和權衡點是關鍵的架構 決策。敏感點是一個或多個構件(和/或構件之間的關系)的特性。研究敏感點可使設計人員 或分析員明確在搞清楚如何實現質量目標時應注意什么。權衡點是影響多個質量屬性的特性&#xff0c; …

SSL證書和HTTPS:全面解析它們的功能與重要性

每當我們在互聯網上輸入個人信息、進行在線交易時&#xff0c;背后是否有一個安全的保障&#xff1f;這時&#xff0c;SSL證書和HTTPS便扮演了至關重要的角色。本文將全面分析SSL證書和HTTPS的含義、功能、重要性以及它們在網絡安全中的作用。 一、SSL證書的定義與基本概念 S…

基于微信小程序的停車場管理系統的設計與實現

第1章 緒論 1.1 課題背景 隨著移動互聯形式的不斷發展&#xff0c;各行各業都在摸索移動互聯對本行業的改變&#xff0c;不斷的嘗試開發出適合于本行業或者本公司的APP。但是這樣一來用戶的手機上就需要安裝各種軟件&#xff0c;但是APP作為一個只為某個公司服務的一個軟件&a…

寶塔找不到php擴展swoole,服務器編譯安裝

1. 在php7.4中安裝swoole&#xff0c;但找不到這個擴展安裝 2. 服務器下載源碼解壓安裝 http://pecl.php.net/package/swoole 下載4.8.0版本 解壓到/www/server/php/74/下 3. 發現報錯問題&#xff1b; 更新一下依賴 yum update yum -y install gcc gcc-c autoconf libjpe…

大數據測試總結

總結測試要點&#xff1a; 參考產品文檔&#xff0c;技術文檔梳理以下內容 需求來源 業務方應用場景 數據源&#xff0c;數據格轉&#xff0c;數據產出&#xff0c;數據呈現方式&#xff08;數據消亡史&#xff09;&#xff0c;數據量級&#xff08;增量&#xff0c;全量&am…

React封裝通用Table組件,支持搜索(多條件)、篩選、自動序號、數據量統計等功能。未采用二次封裝調整靈活,包含使用文檔

封裝通用組件 一、封裝思想二、react代碼三、css代碼四、實現效果五、使用文檔 BasicTableModal 表格模態框組件1.組件簡介2.功能特點3.使用方法基礎用法寬度控制示例帶篩選功能搜索功能示例自定義單元格渲染 4.API 說明PropsColumn 配置項Filter 配置項 5.注意事項 一、封裝思…

React 中 useState 的 基礎使用

概念&#xff1a;useState 是一個React Hook&#xff08;函數&#xff09;&#xff0c;它允許我們向組件添加狀態變量&#xff0c;從而影響組件的渲染結果。 本質&#xff1a;和普通JS變量不同的是&#xff0c;狀態變量一旦發生變化&#xff0c;組件的視圖UI也會跟著變化&…

Html5學習教程,從入門到精通,HTML `<div>` 和 `<span>` 標簽:語法知識點與案例代碼(12)

HTML <div> 和 <span> 標簽&#xff1a;語法知識點與案例代碼 一、語法知識點 1. <div> 標簽 定義: <div> 是一個塊級元素&#xff0c;用于將文檔內容劃分為獨立的、可樣式化的部分。它本身沒有特定的語義&#xff0c;主要用于布局和分組。特點: 塊…

Hbase偽分布安裝教程,詳細版

注意Hbase版本與Hadoop版本的兼容&#xff0c;還有與JDK版本的兼容 本次用到的Hbase為2.4.6版本&#xff0c;Hadoop為3.1.3版本&#xff0c;JDK為JDK8 打開下面的網址查看兼容問題 Apache HBase Reference Guidehttps://hbase.apache.org/book.html#configuration 點擊基礎先…

Python項目】基于Python的圖像去霧算法研究和系統實現

Python項目】基于Python的圖像去霧算法研究和系統實現 技術簡介&#xff1a;采用Python技術、MYSQL數據庫等實現。 系統簡介&#xff1a;圖像去霧系統主要是基于暗通道先驗和逆深度估計技術的去霧算法&#xff0c;系統功能模塊分為&#xff08;1&#xff09;圖像上傳模塊&…

Stable Diffusion Prompt編寫規范詳解

Stable Diffusion Prompt編寫規范詳解 一、語法結構規范 &#xff08;一&#xff09;基礎模板框架 [質量強化] [主體特征] [環境氛圍] [風格控制] [鏡頭參數]質量強化&#xff1a;best quality, ultra detailed, 8k resolution?主體特征&#xff1a;(1girl:1.3), long …

勿以危小而為之勿以避率而不為

《故事匯之&#xff1a;所見/所聞/所歷/所想》&#xff1a;《公園散步與小雨遇記》&#xff08;二&#xff09; 就差一點到山頂了&#xff0c;路上碰到一阿姨&#xff0c;她說等會兒要下大雨了&#xff0c;讓我不要往上走了&#xff0c;我猶豫了一會兒&#xff0c;還是聽勸地返…

wheel_legged_genesis 開源項目復現與問題記錄

Reinforcement learning of wheel-legged robots based on Genesis System Requirements Ubuntu 20.04/22.04/24.04 python > 3.10 開始配置環境&#xff01; 點擊releases后進入&#xff0c;下載對應最新版本的代碼&#xff1a; 將下載后的代碼包解壓到你的自定義路徑下&…

Gin框架從入門到實戰:核心用法與最佳實踐

為什么選擇Gin框架&#xff1f; Gin 是一個基于 Go 語言的高性能 Web 框架&#xff0c;具備以下優勢&#xff1a; 輕量高效&#xff1a;底層依賴 net/http&#xff0c;性能接近原生。簡潔優雅&#xff1a;API 設計友好&#xff0c;支持路由分組、中間件鏈、參數綁定等特性。生…

Leetcode 3468. Find the Number of Copy Arrays

Leetcode 3468. Find the Number of Copy Arrays 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3468. Find the Number of Copy Arrays 1. 解題思路 這一題的話思路上就是一個范圍考察&#xff0c;顯然&#xff0c;對于指定的copy方式&#xff0c;只要我們確定了第一個元素&…

VirtualBox虛擬機MacOS從Big Sur升級到Sequoia(失敗)

VirtualBox虛擬機里安裝好Big Sur版本&#xff0c;嘗試升級到Sequoia&#xff0c;但是最終失敗了。 軟件升級 直接在系統偏好-軟件更新里可以看到提示&#xff0c;提示可以升級到15版本Sequoia 點擊同意&#xff0c;看能不能升級到Sequoia吧。升級前先用時光做了備份。 升級…