android studio如何通過 jni 調(diào)用第三方非標(biāo)準(zhǔn) so庫
調(diào)用第三方的so方法,但這個so內(nèi)的方法不是標(biāo)準(zhǔn)的jni方法。這就需要我們自己寫jni然后鏈接到第三方so庫,通過jni調(diào)用so庫中的方法。
1.簡述:
要先有第三方的so庫.so文件和編譯庫對應(yīng)的.h頭文件
- 我們自己用 c/c++ 創(chuàng)建一個標(biāo)準(zhǔn)的so 庫,比如 mynative.so
- 然后用我們自己的mynative.so 庫中去調(diào)用第三方的libnative.so庫
- 我們在上層 調(diào)用我們自己的mynativeso 庫 ,就實(shí)現(xiàn)了對第三方 libnativeso 庫 方法的調(diào)用。
2.先編譯出一個第三方非標(biāo)準(zhǔn)so庫
1).android studio 新創(chuàng)建一個項目
我們先制作一個非標(biāo)準(zhǔn) jni 庫,只要功能實(shí)現(xiàn)兩個數(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).配置項目的build.gradle
6).配置 gradle.properties
android.useDeprecatedNdk=true
7).編譯第三方非標(biāo)準(zhǔn)庫,直接運(yùn)行即可。
3.新建項目引用第三方 so 庫
1)新建 android studio 項目
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到項目目錄中的源碼目錄下,并執(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文件,這個是必須的,如果依賴的第三方庫沒有.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開發(fā)必備知識 為什么說Kotlin值得一試
為什么說值得一試,這篇文章主要為大家詳細(xì)介紹了Android開發(fā)必備知識,Kotlin的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05談?wù)凙ndroid里的Context的使用實(shí)例
這篇文章主要介紹了談?wù)凙ndroid里的Context的使用實(shí)例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-11-11Flutter使用NetworkImage實(shí)現(xiàn)圖像顯示效果
這篇文章主要為大家介紹了如何在Flutter中使用NetworkImage實(shí)現(xiàn)圖像顯示效果,文中的示例代碼講解詳細(xì),快跟隨小編一起學(xué)習(xí)一下吧2022-04-04利用DrawerLayout和觸摸事件分發(fā)實(shí)現(xiàn)抽屜側(cè)滑效果
這篇文章主要為大家詳細(xì)介紹了利用DrawerLayout和觸摸事件分發(fā)實(shí)現(xiàn)抽屜側(cè)滑效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Android Animation實(shí)戰(zhàn)之一個APP的ListView的動畫效果
這篇文章主要介紹了Android Animation實(shí)戰(zhàn)項目,為大家分享了一個APP的ListView的動畫效果,感興趣的小伙伴們可以參考一下2016-01-01android USB如何修改VID具體實(shí)現(xiàn)
在android 設(shè)備的Linux 內(nèi)核中把 USB 驅(qū)動的 PID VID 修改以后,也許之前的adb工具就不能識別設(shè)備了,會打印出"device not found"的提示2013-06-06Android 中CheckBox多項選擇當(dāng)前的position信息提交的示例代碼
這篇文章主要介紹了Android 中CheckBox多項選擇當(dāng)前的position信息提交的示例代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-07-07Android中使用OkHttp包處理HTTP的get和post請求的方法
OkHttp包為安卓開發(fā)中的HTTP協(xié)議網(wǎng)絡(luò)編程帶來了很大的便利,這里我們就來看一下最基本的、Android中使用OkHttp包處理HTTP的get和post請求的方法:2016-07-07Android launcher中模擬按home鍵的實(shí)現(xiàn)
這篇文章主要介紹了Android launcher中模擬按home鍵的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-05-05