android 淺嘗JNI 打包so庫
接觸安卓有一段時間了,一直沒有時間或者說自己沒有主動去練習一些jni,今天就來分享一下jni的過程、步驟
我用的環境是studio jdk1.8
1:下載ndk 地址自行百度 安裝完成後配置環境變數
2:AS新建一個專案,然後開啟設定 配置一下ndk路徑
然後配置一下gradle檔案 如圖
3: 這時候開始編寫程式碼了,如下圖
不擅長文字描述,多用圖片,大家別介意,重點來了:
4: 命令列進入剛才編寫的NativeTest檔案路徑 javac 類名.java生成javac檔案 如圖:
然後開始編譯生成.h標頭檔案 javah 包名.類名看下圖 注意命令列目錄位置:
5:有了標頭檔案 接下來要建立jni目錄 編寫c程式碼了 步驟 如圖:
直接點finish就好 然後複製剛才的.h標頭檔案到這個目錄裡面 如圖:
這時候建立一個.c檔案 開始編寫c程式碼了 如圖:
好了 開始編寫c程式碼 在剛剛建立的.c檔案編寫 先引入.h標頭檔案:
#include <com_ndktest_NativeTest.h>`
下一步 重寫.h標頭檔案的方法:
//
// Created by Administrator on 2017/9/14 0014.
//
#include <com_ndktest_NativeTest.h>
JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getHint
(JNIEnv *env, jclass obj){
return (*env)->NewStringUTF(env,"簡單的方法返回值 ,不傳引數");
}
JNIEXPORT jstring JNICALL Java_com_ndktest_NativeTest_getToastInfo
(JNIEnv *env, jclass o, jstring s){
return s;
}
配置一下等下要生成的so名字 架構:
接下來 在剛才的cpp目錄 建立 Android.mk檔案 用於編寫so的一些配置:
還有一個Application.mk檔案:
重點來了;開始打包so庫
7: 命令如下圖:
大功完成99,還差最後一點點 註釋掉剛才build裡的這幾句話 刪除也可以:
ndk {
moduleName "test"//指定生成的so檔名
abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的型別
}
sourceSets.main {
jni.srcDirs = ['libs']
}
然後在專案的main目錄新建一個jniLibs目錄 拷貝libs裡的全部架構進去,刪除libs obj jni目錄檔案 當然,你喜歡 也可以複製到其他地方儲存
最後一步了 我們回到一開始編寫的NativeTest.java類裡面 初始化一下我們打包的so庫:
package com.ndktest;
public class NativeTest {
static {
System.loadLibrary("test");
}
public static native String getHint();
public static native String getToastInfo(String values);
}
然後可以去呼叫這個類的方法了 :
package com.ndktest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.util.Xml;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this,
"jni返回的提示:" + NativeTest.getHint() + " 傳過去的引數: "
+ NativeTest.getToastInfo("sdadasda"),
Toast.LENGTH_SHORT).show();
Log.e("jni返回的提示",NativeTest.getHint());
Log.e("傳過去的引數",NativeTest.getToastInfo("sdadasda"));
}
}
好了,本文到這裡結束了,希望大家喜歡;
ps:在.c裡面返回字串的時候 使用這個NewStringUTF 請注意,如果你在java裡傳過去的是字串 ,請別用NewStringUTF 進行編碼 會報錯,解決方法兩個 1:不使用NewStringUTF ,原樣返回值,2 :對傳過來的java字串進行轉碼,比較麻煩,自行百度。如有疑問請郵件留言 [email protected]
相關推薦
android 淺嘗JNI 打包so庫
接觸安卓有一段時間了,一直沒有時間或者說自己沒有主動去練習一些jni,今天就來分享一下jni的過程、步驟 我用的環境是studio jdk1.8 1:下載ndk 地址自行百度 安裝完成後配置環境變數 2:AS新建一個專案,然後開啟設定 配置一下
在Android原始碼中如何吧so庫打包編譯進入apk, 整合第三方庫(jar和so庫)
整合第三方so和jar包 include $(CLEAR_VARS) #jar包編譯 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=securitysdk:libs/hello.jar #64和32系統選擇不同的庫 if
Android Studio JNI生成so庫
JNI生成so檔案 1.新建Android studio工程 2.新建class:AppKey.java.主要為了儲存金鑰 程式碼塊 package com...admina
Ubuntu下編譯android所需ffmpeg的so庫
編譯ffmpeg原始碼 環境說明 環境(包括版本)儘量下面的保持一致,其他環境不一定能成功。 系統: Ubuntu16.04 LTS 最好不要再windows系統下編譯,可在windows中安裝VMware虛擬一個linux系統出來,對linux
android studio中使用第三方so庫(終結版)
安卓開發中,經常會用到第三方C++庫,然後不知道是我對系統不熟悉的原因,還是安卓支援C++開發本來就比較弱,反正其中踩了很多坑。 android studio 版本 3.0.1, 在PC上安裝android studio3.1.2,就是配置不成功,後面再筆
android使用C/C++呼叫SO庫
轉載來源:http://biancheng.dnbcw.info/shouji/400358.html 有時候,我們反編譯apk得到一個so庫,如果直接使用這個so庫的話,必須使用原來so庫同樣的package名字,才能用。 這樣人家反編譯你的apk,就知道你侵犯了人家
android 通過Android.mk將三方的so庫編譯到apk裡
在網上找了好多沒有一個能解決此問題,於是自己分析其原理自己寫了一個Android.mk檔案。通過實驗可以將三方的os庫編譯到apk包裡,編譯完生成的apk包你開啟會看到有個libs目錄,so庫就放在libs/armeabi目錄下,下面是Android.mk檔案的寫法 寫法一
android開發ndk呼叫第三方so庫
1.0 功能概述 1.0.1 概述 在android開發中,java呼叫C/C++函式庫是經常遇到的,我們的android開發中使用JNI開發技術,有下面幾種情況: 已經使用C/C++發了某些函式庫,如果再使用java封裝相應的函式庫的話,可能會話費
Android Studio之正確匯入SO庫
Android Studio之正確匯入SO相關檔案 之前一直沒有做過第三方的推送訊息,這次公司要求採用國內極光第三方推送服務,由於專案還在原型圖構思中,因而還可以花點時間看看這方面的東西。 看了下相關的DEMO,挺簡單的,加點許可權,把相關的廣播以及服務
JNI入門教程1---Android studio 下JNI程式設計例項並生成so庫
參考地址: https://www.cnblogs.com/jymblog/p/5526865.html https://www.jianshu.com/p/a
Android平臺下JNI呼叫第三方so庫
首先說一下在網上查詢資料時,對於呼叫第三方so庫,有人說有兩種方法: 1. 對於so庫的API符合JNI格式(即使用javah指令生成的標頭檔案中那種格式),可以在Java程式碼中宣告它對應的native方法,直接調 用。 &
Android so 庫按需打包
Fresco 大部分的程式碼是由Java寫的,但是裡面也有很多C++的程式碼。C++程式碼必須根據Android 裝置的CPU型別(通常稱為”ABIs”)進行編譯。目前Fresco支援五種 ABI: armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以後的生產的大部分Andr
Android 靜態和動態的呼叫so庫(JNI)
優點 為什麼我們需要動態載入?因為靜態載入中CPU的資料夾我們可能需要相容的話需要放在不同arm資料夾下,那麼就會導致apk 包體過大,還有安卓Android SDK系統版本導致的差異,所以我們採用動態載入 so 庫檔案的話最主要的好處就是可以減小
Android JNI以及打包so檔案到apk中
W/dalvikvm( 5177): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/miui/userbook/util/Patcher; W/dalvikvm( 5177): threadid=12: th
JNI開發(一) 簡單的C程式碼打包成SO庫以及專案如何呼叫SO庫
前段時間開發過程中用到了簡單的JNI使用,當時發現很多網上文章總有這樣那樣的問題,最近趁時間充裕就記錄下來,以供記憶和交流。 JNI環境配置 這裡就不做多講,百度一下,把腳跨過牆就好。 寫
android Jni編譯多平臺so庫
前兩天換了個x64晶片的手機,發現公司APP在上面閃退,原因是找不上x64的庫 首先我吧預設的so庫賦值到目錄arm64-v8a 重新開啟,報錯原因是改庫非64位的庫 然後我打開了以前的JNI開發專案,搜尋相關解決方案,最終找到解決方案。 開啟JnI目錄下的Applicat
android 調用c文件生成so庫並調用
dem ges classes lib fault rms img div 節點 公司需要做一個sdk,裏面需要用到別人寫的c文件,第一次做,各種百度,各種學習,現在做一個小總結: 一、新建一個project:例 ExampleDemo, 包名為:com.demo.exam
Android Studio2.2.3 通過JNI引用ffmpeg庫小結
android studio;ffmpeg;ndk;jni修改步驟:首先通過NDK14編譯出libffmpeg.so ,將include目錄取出通過AS建立基於jni的工程項目,將include目錄放到cpp下;創建jniLibs/armeabi目錄,將libffmpeg.so放到裏邊 3.配置CMak
Android Studio指定引用jnilibs 特定CPU架構的so庫文件
文件 jni adl 性能 沒有 1.2 x86_64 apk andro 稍微大一些的項目都會用到第三方庫,所以不可避免的會有針對不同手機cpu架構的.so庫文件 ‘x86‘, ‘x86_64‘, ‘mips‘, ‘mips64‘ ‘armeabi‘ ,‘armeab
關於多個名字相同的.so庫的打包
es2017 定位 red 文件 ima oid 添加 andro img 1.修改Andriod.mk下的.a文件的配置(如百度定位的SDK) 2.修改Application.mk 這裏只是寫了默認的和V7a需要其他 的按照這個格式添加即可;(有的也許需要將APP_A