1. 程式人生 > >Android使用已有C/C++程式碼、第三方SO庫的方法(JIN學習)

Android使用已有C/C++程式碼、第三方SO庫的方法(JIN學習)

1.配置好NDk編譯環境(這個Google一下,:))

2.將已有C/C++程式碼,編譯成SO檔案

3.Eclipse中新建Android工程,建立一個jni目錄。如下所示


4.在jni目錄建立C/C++檔案,裡面呼叫步驟2函式,或者第三方SO的函式

5.建立Android.mk檔案,內容為:

LOCAL_PATH := $(call my-dir)
# Link libXXX.so
include $(CLEAR_VARS)  
LOCAL_MODULE :=XXX  
LOCAL_SRC_FILES := libXXX.so  
#LOCAL_SRC_FILES := /jni/libXXX.so  
include $(PREBUILT_SHARED_LIBRARY)  

include $(CLEAR_VARS)
LOCAL_MODULE    := XXXAgent
LOCAL_SRC_FILES := XXXAgent.cpp
LOCAL_SHARED_LIBRARIES := XXX
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY)

將XXX替換為編譯出的SO或者第三方SO的名字

6.將jni目錄下的C/C++編譯成Android通過JNI呼叫的SO檔案,這裡名字為  libXXXAgent.so

7.Android工程中使用時,首先載入一下用到的SO庫,即可正常使用了。

System.loadLibrary("XXX");
System.loadLibrary("XXXAgent");

說明:這裡的重點是如何呼叫第三方SO庫,所有部分細節沒有表述。比如Javah生成相關標頭檔案,jni呼叫等。

補充:上面步驟可能比較多,這裡舉一個例子加以說明。某天,你得到一個第三SO庫,名字就叫XXX。你發現裡面的功能正好是你Android專案裡需要的,可以拿來就用。這個訊息令你高興萬分啊那是。但是,如何在Android裡使用呢,XXX庫裡的呼叫約定不符合JNI規定,是不能直接來用的。哈哈,想到了,建立一個XXXAgent.so。它的呼叫採用JNI,然後在實現裡呼叫第三方SO就可以了。以上就是大概的思路。

SO檔案是如何自動安裝到虛擬機器或者手機上呢,NDK生成的SO檔案會自動放到libs/armeabi目錄下。而此目錄下的SO檔案都會自動打包到APK,安裝後釋放到/data/data/專案名字/lib/下。這裡XXXAgent.SO檔案生成libs/armeab,XXXAgent.SO依賴XXX檔案,XXX檔案自動拷貝到libs/armeab下。(XXX檔案放在jni下,和Android.mk同級,這個是和Android.mk裡的設定配合使用的)


相關推薦

JIN學習Android使用C/C++程式碼第三方SO方法

1.配置好NDk編譯環境(這個Google一下,:)) 2.將已有C/C++程式碼,編譯成SO檔案 3.Eclipse中新建Android工程,建立一個jni目錄。如下所示 4.在jni目錄建立C/C++檔案,裡面呼叫步驟2函式,或者第三方SO的函式 5.建立Androi

Android使用C/C++程式碼第三方SO方法JIN學習

1.配置好NDk編譯環境(這個Google一下,:)) 2.將已有C/C++程式碼,編譯成SO檔案 3.Eclipse中新建Android工程,建立一個jni目錄。如下所示 4.在jni目錄建立C/C++檔案,裡面呼叫步驟2函式,或者第三方SO的函式 5.建

Android Studio配置CMakeLists.txt來載入第三方SO

要使用第三方庫首先當然是載入第三方庫的標頭檔案 使用include_directories來包含第三方標頭檔案,多個路徑用空格隔開,新增在cmake_minimum_required的下面 include_directories(xxx/include ../xxx)  例如

java程式設計師學C#基本語法兩個小時搞定對比學習

對於學習一門新的語言,關鍵是學習新語言和以前掌握的語言的區別,但是也不要讓以前語言的東西,固定了自己的思維模式,多看一下新的語言的程式設計思想。 1.引包   using System;java用import 2.建構函式和java語法相同 3.解構函式  &n

C#解決MDI窗體閃屏的方法 --arvin推薦

最近從師兄手上接了一個C#的專案,需要用到MDI窗體,可是每當我顯示子窗體的時候會有一次“閃爍”,很明顯,看起來非常不爽,查詢許久,知道是每次在show()子窗體的時候都會呼叫子窗體建構函式重繪窗體,其中需要將子窗體的尺寸調整到我在程式中設定的大小,無論我這樣設定,這個視

C#中 XML 讀寫檔案的方法xmlreader,xmlwriter

class Test     {         public static void Main(string[] args)         {             string path = "d:\\books.xml";                         XmlReader read

軟技能-程式碼之外的生存指南3自我學習

前言 承蒙大家的厚愛,為我第一篇(職業生涯)讀書筆記點了很多贊,可是為啥第二篇(自我營銷)沒人點讚了呢?第二篇自我營銷也是對程式設計師非常重要的。結果大家都忽略不計了。可能自我營銷大家心裡都充滿了鄙視吧。作者的第3篇自我學習,也是乾貨滿滿。還是要學習下的。前人走過了很多彎路然後給了很多經驗,如果我們不再去吸

QT tabwidget 程式碼新增標籤頁的方法可以最大化

QT用程式碼對介面進行佈局時,按常規思路在tabwidget遇到一個很大的問題:就是最大化後有問題,沒有實現最大化的效果。 後來通過各種查詢最後又找到一種方法對tabwidget新增頁: //.h檔案 class Data : public QMainWin

JSPEL表示式JSTL標籤乾貨建議收藏

> JSP(Java Server Pages)類似於[ASP](https://www.w3school.com.cn/asp/asp_intro.asp)技術,它是**在傳統的網頁HTML**檔案(.htm,.html)中**插入Java程式段(Scriptlet)**和**JSP標記(tag**)

布爾類型操作符別名C++函數動態內存分配newdelete引用day02

color 返回 void double 強制 也會 了解 關系 指針 六 C++的布爾類型 1 bool類型是C++中基本類型,專門表示邏輯值:true/false 2 bool在內存上占一個字節:1表示true,0表示false 3 bool類型可以接收任意類型和表達

React-Native開發二 Android 專案整合React-Native

1 前言 之前寫過一篇RN的環境搭建教程和新建一個新的RN專案的文章 https://blog.csdn.net/qiyei2009/article/details/78820207 但是其實在實際開發中,在已有的android專案中整合RN情況更普遍,這篇文章就是一個怎麼在已有

【Django2x 學習筆記 05】面向api模板使用者請跳過,操作資料庫的查詢增加修改

根據部落格https://blog.csdn.net/itas109/article/details/80898943 才知道如何查詢已有資料庫欄位。 Django官方文件https://docs.djangoproject.com/zh-hans/2.0/寫的真爛,愣是沒找到如何

如何將自己寫的一段C++程式碼封裝成.so以供其他人呼叫

1.通過自己寫的canbus函式程式碼,先生成一個libcanbus.so連結庫 canbus.cpp程式碼如下: 編譯指令如下: $ g++ -Wall -g -fPIC -c canbus.cpp -o canbus.o $ g++ -

思路+程式碼 1039 到底買不買 20 分C語言

思路:這道題就是就是遍歷,但是必須注意一個問題:abcde   aa   如果這兩個陣列,先拿出第二個字串的第一個字母a依次和第一個字串的字母進行比較,但是要注意如果繼續用第二個字串中的第二個字母a繼續進行遍歷,則會發現又會成功,但顯然是不對的,所以我們就用空格“  ”代替第

C# 創建更改Excel命名區域NamedRange

div esp 創建 一個 www 適用於 test mes https 創建命名區域是指給選定的某個單元格或多個單元格區域設置名稱,目的是方便我們在文件中的其他地方對該單元格區域進行引用能夠簡化公式引用或者方便數據管理。下面記錄了具體的C#示例代碼。這裏創建命名區域分為了

稀疏矩陣的儲存方法3種C語言程式碼實現

稀疏矩陣,即含有少量非 0 元素的矩陣,如圖 1 所示:   圖 1 稀疏矩陣    該矩陣中非 0 元素的數量比較少,與其使用普通方式將矩陣中的所有資料元素一一儲存,不如只儲存非 0 元素更節省記憶體空間,拿圖 1 中矩陣來說,只需儲存元素 3、4、5 即可(此類儲存方式被稱為稀疏矩陣的壓縮儲存)。

C# 模擬鍵盤滑鼠操作外部程式模擬使用者操作3DMARK

1.FROM1 CLASS SOURCE CODE: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; u

C++ 中 ZeroMemorymemset 危險需慎用

使用C/C++程式設計時,常使用ZeroMemory、memset或 “={0}”來對結構體物件進行初始化或清零。然而這三種方式都有各自的特點,使用時需謹慎,否則容易出現嚴重錯誤 memset void *memset(void *s,int ch,si

CC++ 的標準分別自己的 locale 操作方法C 標準的 locale 設定函式是 setlocale(),而 C++ 標準 locale 類和流物件的 imbue() 方法gcc使用zh_CN.GBK,或者zh_CN.UTF-8,VC++使用Chinese_People&#

轉自:http://zyxhome.org/wp/cc-prog-lang/c-stdlib-setlocale-usage-note/  [在此向原文作者說聲謝謝!若有讀者看到文章轉載時請寫該轉載地址,不要寫我的BLOG地址。尊重他人的勞動成果 ^_^ ] C 和 C++ 的標準庫分別有自己的

JNI開發 簡單的C程式碼打包成SO以及專案如何呼叫SO

前段時間開發過程中用到了簡單的JNI使用,當時發現很多網上文章總有這樣那樣的問題,最近趁時間充裕就記錄下來,以供記憶和交流。 JNI環境配置 這裡就不做多講,百度一下,把腳跨過牆就好。 寫