最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android studio如何通過 jni 調(diào)用第三方非標(biāo)準(zhǔn) so庫

 更新時(shí)間:2025年04月11日 09:46:49   作者:susu1083018911  
這篇文章主要介紹了android studio如何通過 jni 調(diào)用第三方非標(biāo)準(zhǔn) so庫,調(diào)用第三方的so方法,但這個(gè)so內(nèi)的方法不是標(biāo)準(zhǔn)的jni方法,這就需要我們自己寫jni然后鏈接到第三方so庫,通過jni調(diào)用so庫中的方法,需要的朋友可以參考下

調(diào)用第三方的so方法,但這個(gè)so內(nèi)的方法不是標(biāo)準(zhǔn)的jni方法。這就需要我們自己寫jni然后鏈接到第三方so庫,通過jni調(diào)用so庫中的方法。

1.簡述:

要先有第三方的so庫.so文件和編譯庫對應(yīng)的.h頭文件

  • 我們自己用 c/c++ 創(chuàng)建一個(gè)標(biāo)準(zhǔn)的so 庫,比如 mynative.so
  • 然后用我們自己的mynative.so 庫中去調(diào)用第三方的libnative.so庫
  • 我們在上層 調(diào)用我們自己的mynativeso 庫 ,就實(shí)現(xiàn)了對第三方 libnativeso 庫 方法的調(diào)用。

2.先編譯出一個(gè)第三方非標(biāo)準(zhǔn)so庫

1).android studio 新創(chuàng)建一個(gè)項(xiàng)目

我們先制作一個(gè)非標(biāo)準(zhǔn) jni 庫,只要功能實(shí)現(xiàn)兩個(gè)數(shù)相加 ,并返回相加后的結(jié)果。

2).main 新創(chuàng)建 jni 文件夾

3).新建 .cpp 文件和 .h 實(shí)現(xiàn)求和功能,并把文件放在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)
#設(shè)置生成的so動態(tài)庫最后輸出的路徑
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
#生成so
add_library( # 設(shè)置生成庫的名字
        nativeso
        # 生成動態(tài)庫
        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).配置項(xiàng)目的build.gradle

6).配置 gradle.properties

android.useDeprecatedNdk=true

7).編譯第三方非標(biāo)準(zhǔn)庫,直接運(yùn)行即可。

3.新建項(xiàng)目引用第三方 so 庫

1)新建 android studio 項(xiàng)目

2)新建 java 類,封裝想要調(diào)用的接口函數(shù)

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)創(chuàng)建 對應(yīng)的 jni java 類文件的頭文件

在Termial控制臺中cd到項(xiàng)目目錄中的源碼目錄下,并執(zhí)行命令生成.h文件

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

執(zhí)行完成后,會在 java 目錄生成 對應(yīng) .h 文件

5) main 文件夾 下新建 jni文件夾,實(shí)現(xiàn)底層邏輯

  • 將上一步 生成 .h 文件 拷貝進(jìn)來,以及第三方so提供的對應(yīng).h頭文件也要拷貝到j(luò)ni目錄中
  • 根據(jù).h 文件 編寫 對應(yīng)的 .cpp 文件 ,在cpp 文件里實(shí)現(xiàn)對 第三方 so 庫 的引用
  • 自己實(shí)現(xiàn)的邏輯中調(diào)用第三方.h內(nèi)容

jninative.cpp 文件

 
#include <jni.h>
#include <string>
#include <test.h>//導(dǎo)入需要的.h文件,這個(gè)是必須的,如果依賴的第三方庫沒有.h,需要自己編寫
extern "C"
JNIEXPORT jint JNICALL Java_com_example_demo05_JniCallNative_getAddFromNative
        (JNIEnv *, jclass, jint a, jint b){
    //生成add對象并調(diào)用方法
    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)
#設(shè)置生成的so動態(tài)庫最后輸出的路徑
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
#生成so
add_library( # 設(shè)置生成庫的名字
        mynativeso
        # 生成動態(tài)庫
        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(nativeso
        PROPERTIES 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)  配置環(huán)境 build.gradle和 gradle.properties

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

10) 主函數(shù)調(diào)用測試

<?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">
    <TextView
        android: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 {
    @Override
    protected 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 + "");
    }
}

到此這篇關(guān)于android studio通過 jni 調(diào)用第三方非標(biāo)準(zhǔn) so庫的文章就介紹到這了,更多相關(guān)android studio調(diào)用so庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android數(shù)據(jù)庫greenDAO配置與使用介紹

    Android數(shù)據(jù)庫greenDAO配置與使用介紹

    這篇文章主要介紹了Android集成GreenDao數(shù)據(jù)庫,使用數(shù)據(jù)庫存儲時(shí)候,一般都會使用一些第三方ORM框架,比如GreenDao,本文分幾步給大家介紹Android集成GreenDao數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2023-03-03
  • Android應(yīng)用開發(fā)中自定義ViewGroup的究極攻略

    Android應(yīng)用開發(fā)中自定義ViewGroup的究極攻略

    這里我們要演示的自定義ViewGroup中將實(shí)現(xiàn)多種方式排列和滑動等效果,并且涵蓋子View之間Touch Event的攔截與處理等問題,完全干貨,下面就為大家送上Android應(yīng)用開發(fā)中自定義ViewGroup的究極實(shí)例攻略
    2016-05-05
  • Android ListView仿微信聊天界面

    Android ListView仿微信聊天界面

    這篇文章主要為大家詳細(xì)介紹了ListView仿微信聊天界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Android自定義引導(dǎo)玩轉(zhuǎn)ViewPager的方法詳解

    Android自定義引導(dǎo)玩轉(zhuǎn)ViewPager的方法詳解

    這篇文章主要給大家介紹了關(guān)于Android自定義引導(dǎo)玩轉(zhuǎn)ViewPager的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 淺析Android文件管理器(項(xiàng)目一)

    淺析Android文件管理器(項(xiàng)目一)

    這篇文章主要介紹了淺析Android文件管理器(一)的相關(guān)資料,需要的朋友可以參考下
    2015-11-11
  • Android中通過MediaStore獲取音樂文件信息方法

    Android中通過MediaStore獲取音樂文件信息方法

    這篇文章主要介紹了Android中通過MediaStore獲取音樂文件信息方法,本文講解了獲取歌曲的名稱、歌曲的專輯名、歌曲的歌手名、歌曲文件的全路徑、歌曲文件的名稱、歌曲文件的發(fā)行日期等音樂文件信息的方法,需要的朋友可以參考下
    2015-04-04
  • Android中ConstraintLayout約束布局的最全詳細(xì)解析

    Android中ConstraintLayout約束布局的最全詳細(xì)解析

    ConstraintLayout是Google在Google?I/O?2016大會上發(fā)布的一種新的布局容器(ViewGroup),它支持以靈活的方式來放置子控件和調(diào)整子控件的大小,下面這篇文章主要給大家介紹了關(guān)于Android中ConstraintLayout約束布局詳細(xì)解析的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Android開發(fā)之圖片壓縮工具類完整實(shí)例

    Android開發(fā)之圖片壓縮工具類完整實(shí)例

    這篇文章主要介紹了Android開發(fā)之圖片壓縮工具類,結(jié)合完整實(shí)例形式分析了Android針對圖片壓縮的相關(guān)屬性設(shè)置與轉(zhuǎn)換操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-11-11
  • 詳解ListView中多種item的實(shí)現(xiàn)方式

    詳解ListView中多種item的實(shí)現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于ListView中多種item的實(shí)現(xiàn)方式,文中通過示例代碼介紹的很詳細(xì),有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • A07_TimePicker & DatePicker & AnalogClock & DigitalClock 的設(shè)置小結(jié)

    A07_TimePicker & DatePicker & AnalogClock & Digi

    本文將帶領(lǐng)大家一起學(xué)習(xí)時(shí)間日期和時(shí)鐘的設(shè)置。A07_TimePicker & DatePicker & AnalogClock & DigitalClock 的設(shè)置,感興趣的朋友可以參考下哈
    2013-06-06

最新評論

清流县| 东台市| 徐闻县| 资溪县| 大方县| 寻甸| 宜兰市| 上高县| 垦利县| 茌平县| 乐陵市| 滨海县| 太保市| 道孚县| 营山县| 孙吴县| 曲麻莱县| 阜新市| 正安县| 江西省| 平泉县| 宝兴县| 桐柏县| 疏勒县| 泰安市| 锡林浩特市| 九江市| 城固县| 七台河市| 芒康县| 新安县| 志丹县| 始兴县| 分宜县| 隆昌县| 普洱| 安吉县| 南充市| 康乐县| 广平县| 五常市|