NDK+OpenSSl,通過JNI技術開發so加密庫
以下是個人在做加密演算法庫時一些經驗總結,今天把它寫下來分享給大家,希望對大家以後再做類似的開發工作時能有所幫助,少走些彎路。
主要從以下5個方面進行闡述:
1. Openssl安裝,1.0.1與1.0.2使用時的區別
2. Linux下gcc的使用方法,及可能遇到的問題
3. JNI開發,開發流程
4. NDK使用方法,以及打包so庫時如何編寫Application.mk檔案
5.IOS打包基於openssl庫的靜態庫時需注意那些
一. Openssl安裝,1.0.1與1.0.2使用時的區別
參考網上的教程:
① 到openssl官網下載openssl包openssl-1.0.1e.tar.gz
② 使用
③ Cd進入openssl-1.0.1e目錄下,執行
./config --prefix=/usr/local --openssldir=/usr/local/ssl
make && make install
./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
make clean
make && make install
以上方法是我從網上copy下來的,若自己的機器上沒有openssl,可以參考安裝。
檢視自己機器上是否已經安裝openssl的方法,執行openssl version
在使用Openssl庫開發時,需要注意1.0.1和1.0.2中有些方法的引數是不同的。例如1.0.1的bio.h中有個方法BIO *BIO_new_mem_buf(void *buf, int len),而其在1.0.2中則是BIO *BIO_new_mem_buf(const void *buf, int len)。所以在打包時要注意,開發環境和打包環境中的庫是不是同一個版本,若不是需要在呼叫某些方法時稍作改動,一般使用指標型別強轉下就可以解決。
二. Linux下gcc的使用方法,及可能遇到的問題
gcc主要是用來編譯.c檔案,編譯.cpp檔案可以使用g++
-o指定輸出檔名
-c只編譯不連線
-g產生供gdb除錯用的可執行檔案
-l連結庫,後跟庫名,linux下的庫名一般是lib+庫名+.so形式
-L指定連線庫路徑
-I指定include檔案路徑
-fPIC在編譯階段使用,告訴編譯器產生與位置無關程式碼,一般在編譯動態共享庫用到。
-shared設定共享,一般是在編譯動態共享庫時會用到。
用例:hello.c
編譯成可執行檔案:gcc hello.c –o main,這要求hello.c中必須有int main()函式的實現。
編譯生成中間檔案:gcc hello.c -o hello.o,hello.c中不需要有main函式的實現,生成的.o檔案可以用於編譯動態庫或者是靜態庫。
gcc編譯基於openssl開發的.c檔案時,可能會遇到的問題
① 在編譯的階段提示找不到openssl/aes.h標頭檔案
原因:openssl的include檔案未加入系統路徑,導致gcc在編譯時搜尋不到
解決方法:先找到openssl資料夾路徑,一般是在/usr/include/下,在編譯時使用-I命令指定路徑-I/usr/include/openssl即可。
② 在生成動態庫時提示檔案中使用的openssl庫中方法undefined
原因:在生成動態庫時,未指定依賴的第三方庫
解決方法:-lssl即可,若是還需要依賴自己的其他庫,還需要使用-L命令指定自己的庫路徑。
三. JNI開發,以及開發流程
JNI開發流程主要如下:
① 編寫java檔案,申明native方法,例如helloworld.java
public class helloworld{
public native void say();
static {
System.loadLibrary("hello");
}
public static void main(String[] args){
new helloworld().say();
}
}
② javac helloworld.java生成helloworld.class檔案
③ javah helloworld生成helloworld.h檔案
④ 編寫hello.c檔案,#include“helloworld.h”,實現檔案中的方法
⑤ 生成編譯檔案gcc -fPIC -g -c hello.c -o libhello.o
⑥ 生成共享庫gcc -shared libhello.o -o libhello.so
⑦ java hellworld
可能存在的問題:
(1) 在第⑤步可能會報找不到jni.h檔案
原因: jni.h檔案為加入到系統路徑中,gcc在編譯時找不到jni.h檔案
解決方法:-I/opt/soft/java/include –l/opt/soft/java/include/linux。不同系統路徑不一樣,這是我的系統路徑。
(2) 在第⑦步會報找不到hello庫
原因:生成的共享庫未加入到系統路徑中
解決方法:export LD_LIBRARY_PATH=第⑥步生成的共享庫路徑
(3) 第④步可能會生成不成功
原因:在.java中有package語句,這會導致在本路徑下生成.h不成功
解決方法:可以手動書寫.java對應的.h檔案,書寫規則如下:
(a) 樣版
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class hello */
#ifndef _Included_com_test_demo_hello
#define _Included_com_test_demo_hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_test_demo_hello
* Method: say
* Signature: (Landroid/content/Context;)V
*/
JNIEXPORT void JNICALL Java_ com_test_demo_hello_say
(JNIEnv *, jclass, jobject);
#ifdef __cplusplus
}
#endif
#endif
(b) 其中紅色表示的是該類的全路徑名,淺藍色表示的是類的方法,紫色表示的是jni環境指標,橙色表示的是該類物件(若是靜態方法,則是jclass,若是非靜態方法則是jobject),淺綠色是方法的引數。
(c) JNI中型別對照表:JNI型別——》JAVA型別
V |
void |
void |
N/A |
|
Z |
jboolean |
boolean |
8 unsigned |
|
I |
jint |
int |
32 |
|
J |
jlong |
long |
64 |
|
D |
jdouble |
double |
64 |
|
F |
jfloat |
float |
32 |
|
B |
jbyte |
byte |
8 |
|
C |
jchar |
char |
16 unsigned |
|
S |
jshort |
short |
16 |
|
[I |
jintArray |
int[] |
||
[F |
jfloatArray |
float[] |
||
[B |
jbyteArray |
byte[] |
||
[C |
jcharArray |
char[] |
||
[S |
jshortArray |
short[] |
||
[D |
jdoubleArray |
double[] |
||
[J |
jlongArray |
long[] |
||
[Z |
jbooleanArray |
Boolean[] |
jchar -> jstring
jstring result = env->NewString(jchar *, jsize); 直接將jchar轉換為jstring(Java String)可直接由JNI返回給Java使用。
jcharArray -> jchar*
jchar * jc = (*env)->GetCharArrayElements(env,jcharArray,0);
jbyteArray -> jbyte
jbyte * jby = (*env)->GetByteArrayElements(env,jbyteArray,0);
注意jchar並不能強轉成c中的char,只有jbyte才與c中的char對應。
(d) JNI中一些常用的方法:
GetStringUTFChars將jstring轉換成為UTF-8格式的char*GetStringChars將jstring轉換成為Unicode格式的char*ReleaseStringUTFChars釋放指向UTF-8格式的char*的指標ReleaseStringChars釋放指向Unicode格式的char*的指標NewStringUTF建立一個UTF-8格式的String物件NewString建立一個Unicode格式的String物件GetStringUTFLengt獲取UTF-8格式的char*的長度GetStringLength獲取Unicode格式的char*的長度
jsize len = (*env)->GetArrayLength(env, arr);
釋放物件指標:
ReleaseBooleanArrayElementsReleaseByteArrayElementsReleaseCharArrayElementsReleaseShortArrayElementsReleaseIntArrayElementsReleaseLongArrayElementsReleaseFloatArrayElementsReleaseDoubleArrayElements
四. NDK使用方法,以及打包so庫時如何編寫Application.mk
① NDK是android提供的用於編譯c程式的編譯器,按裝很簡單,從官網上下載下來,解壓到自己的目錄中,然後設定檔案許可權為777,最後編輯/etc/profile檔案,在檔案尾新增NDK=/ndk解壓路徑
export PATH=$NDK:$PATH,然後儲存,執行source /etc/profile,然後執行echo $NDK若輸出不為空,則配置成功。
② cd到自己的jni專案路徑下,執行$NDK/ndk-build即可。注意你的.c檔案的父目錄一定要是jni,即/…/jni/hello.c,生成的.o檔案是在../obj/目錄下,生成的庫檔案是在../libs/目錄下。
五. IOS打包基於openssl庫的靜態庫時需注意那些
最好不要使用記憶體分配,即不要使用malloc,limux下使用malloc分配記憶體後會使用delete或者free釋放記憶體,但是移植到ios下後會出現記憶體釋放異常情況,不相容,建議改成在棧空間上分配,或者使用Object C去實現。若本地沒有openssl可以通過以下方式匯入pod search openssl 或者 pod 引入 [email protected]:openssl/openssl.git
相關推薦
NDK+OpenSSl,通過JNI技術開發so加密庫
以下是個人在做加密演算法庫時一些經驗總結,今天把它寫下來分享給大家,希望對大家以後再做類似的開發工作時能有所幫助,少走些彎路。 主要從以下5個方面進行闡述: 1. Openssl安裝,1.0.1與1.0.2使用時的區別 2. Linux下gcc的使用方法,及可能遇到的問題
init.rc文件中面啟動c++程序,通過jni調用java實現
mini val sni ril urn runtime sport mco env </pre><p>註:假設是自己的myself.jar包,還要修改例如以下:</p><p>target/product/core_bas
Java小題,通過JNI調用本地C++共享庫中的對應方法實現楊輝三角的繪制
question 文件夾 path ron variable iostream ring printf spl 1.在Eclipse中配置Javah,配置如下 位置是你javah.exe在你電腦磁盤上的路徑 位置:C:\Program Files\Java\jdk1.
開發區塊鏈溯源系統優勢,區塊鏈技術開發公司
認同 國內 銷售 區塊 優勢 提供商 失去 浪費 衍生 2018是區塊鏈應用落地元年,許多大佬企業引進區塊鏈技術,其中溯源系統被認為最有前景的項目!那區塊鏈技術能給溯源帶來怎麽樣的變化呢?我們繼續往下看 傳統溯源的劣勢(小生不才,可開發系統) 1.傳統溯源缺乏公信力,消費者
區塊鏈交易所開發,區塊鏈技術開發
區塊鏈交易所可謂是目前區塊鏈技術比較成功的應用,也正是如此,區塊鏈交易所開發才這樣的受歡迎。而開發一個區塊鏈交易所並不是那麼容易的,裡面所涉及到的放東西很多。開發一個區塊鏈交易所的成功離不開這三點。第一,強大的技術支撐是最基礎,也是最強大的推動力,只有強大的技術實力才能給交易所做好保駕護航;第二、安全穩定的服
linux重要文件丟失導致系統故障,修復方法,(以 libc.so.6庫損壞,rpm軟件包故障為例)
救援模式 fff error eee 分享 color 按鈕 服務器 blog 第一步:找出損壞的文件及它的安裝包,安裝修復。修復之前先明確你損壞的文件是屬於那一個軟件包,這個可以在一臺能正常運行的同版本的服務器上查看。 好了知道什麽文件損壞,接下來只要安裝修復就好了。
JAVA通過JNI呼叫C++動態連結庫CLL(一)
簡介 本文筆者,詳細的演示JAVA通過JNI呼叫C++動態連結庫CLL的開發過程和涉及到知識點介紹,入門級簡單易懂 (一)Java本機介面(Java Native Interfa
Android 通過JNI C++進行MD5加密
最近升級了Android Studio 3.0.1。版本升級,越是覺得好用了。 Android Studio使用JNI之前覺得是一件比較麻煩的事,官方文件也不多,有點無從下手。本篇以CMake方式說說如何利用JNI方式使用C++進行MD5加密,這樣經過
Java 通過 JNI 呼叫 C/C++ 類庫
說明 由於一些涉及到裝置或底層操作的類庫,大多是C或C++語言編寫的,對於Java Web開發者,在涉及到相應的專案中,不可能再去將相應的類庫用Java重寫。這時,就需要通過Java程式碼去呼叫C/C++的類庫來完成工作。 操作環境: - JDK 1.8.
Web應用程序開發,基於Ajax技術的JavaScript樹形控件
實現 web應用 建立 tar 框架 目前 動態生成 方案 技術問題 感謝http://www.cnblogs.com/dgrew/p/3181769.html#undefined 在Web應用程序開發領域,基於Ajax技術的JavaScript樹形控件已經被廣泛使用,
北京一福老年病防治有新招,通過音視頻融合通信技術幫您遠程解決!
智慧養老 健康養老 遠程醫療解決方案 我國老年人口數量和增長速度居世界首位,人口老齡化已成為當前嚴峻的社會問題。宣武醫院作為國家遠程卒中中心建設的重點單位,在腦防委的指導下,牽頭開展“北京市老年病醫療研究中心心腦血管病低氧適應平臺”的組建工作,計劃覆蓋全國100+醫院,以期更好地開展老年病防治工作
學習嵌入式技術開發難得不難,看你自己怎麽規劃?三個月幫助你成功,0基礎可學
嵌入式 就業規劃學IT技術,找好工作,就來信盈達。信盈達中國IT培訓實力機構,辦學10年,已經培養IT技術人才20萬。 信盈達IT培訓現可“先學習,後付款“,名額有限,趕快咨詢微信/電話:1/7/7/2/7/6/5/9/3/0/3,如果你想學技術改變現狀,這是一個機會。深圳信盈達嵌入式技術實訓學院已有10年
區塊鏈商城開發,深圳區塊鏈開發,區塊鏈虛擬貨幣技術開發公司
運用 公益 區塊鏈 中心 研究 未來 技術開發 商城 公司 區塊鏈時代已經到來,深圳區塊鏈開發公司 萬通互通公司提供區塊鏈開發技術,在如今這個消息泛濫的網絡時代,機會瞬息萬變,看到趨勢,抓住趨勢才能不被這個社會淘汰,區塊鏈是未來的趨勢。 區塊鏈技術也
深圳區塊鏈商城開發,深圳區塊鏈開發,深圳區塊鏈商城開發技術
領導 是什麽 增長 共識機制 才會 一個人 部分 自動 價值 深圳區塊鏈商城開發,深圳區塊鏈開發,深圳區塊鏈商城開發技術是當前主流的技術,那麽,區塊鏈到底是什麽呢?深圳區塊鏈商城開發,深圳區塊鏈開發,深圳區塊鏈商城開發技術又是什麽呢? 狹義來講,區塊鏈是一種按照時間順序將數
聊區塊鏈技術開發辯證觀,不用神化、也不可低估
不用 中心 中國 51cto 產生 alt space 什麽 辯證 商業時代的更叠促使技術不斷發展,區塊鏈技術開發浪潮在2018年被推向商業風口。多方媒體的輪番熱報後,區塊鏈技術開發可以算是普及大眾!很多人對此有了一個基本的概念認知,但怎樣看帶區塊鏈技術開發的輿論是否正確呢
上海區塊鏈技術開發公司,交易所等系統開發
大小 組成 篡改 密鑰 各種功能 功能 隨機 保密 非對稱加密 區塊鏈具有去中介化或分散中心化、信息不可篡改、透明可追溯、保密性、自信用等特點。區塊鏈的特征和優越性來自於其技術原理。袁勇和王躍飛將區塊鏈的基礎架構分為:數據層、網絡層、共識層、激勵層、合約層和應用層。 數據層
Java開發中,通過sql來實現過濾以及分頁
我們通過一個需求來引入問題。 首先,簡單介紹一下需求:實現一個下圖的頁面,包含了過濾以及分頁。資料是後臺資料庫獲得到的。 那麼關於如何實現過濾以及分頁,考慮到通過前臺實現或者後臺實現,我們不妨來分析一下兩種方法。 首先,前臺實現:無非就是後臺獲取所有的list,傳
ASP.net技術支撐,learun工作流開發分享
一、工作流 根據的定義,工作流就是自動運作的業務過程部分或整體,表現為參與者對檔案、資訊或任務按照規程採取行動,並令其在參與者之間傳遞。簡單地說,工作流就是一系列相互銜接、自動進行的業務活動或任務。 工作流是針對工作中具有固定程式的常規活動而提出的一個概念。通過將工作活動分解成定義良好的任務、角色
通過設定chrome瀏覽器解決跨域問題,在本地進行開發工作
原文:http://www.cnblogs.com/kugeliu/p/6566462.html 後端跨域許可權無法開啟,於是去網上找了下我這邊能不能解決 現在的瀏覽器出於安全策略的限制,都是不允許跨域的,但是開發的時候經常需要一些別的域的介面,特別是一些介面不是自己能控制的時候,往
#程式設計師入職大廠,感覺同事技術厲害,懷疑自己:怎麼通過面試的?
相信大家在剛剛畢業的時候,在技術方面都不是非常成熟,所以在步入職場的時候,感覺周圍的同事都非常厲害,只有自己什麼都不懂,於是會開始懷疑自己的能力:我是怎麼通過面試的? 如果有想學習java的程式設計師,可來我們的java學習扣qun:79979,2590免費送java的視訊教程噢!我整理了一份適