1. 程式人生 > >NDK+OpenSSl,通過JNI技術開發so加密庫

NDK+OpenSSl,通過JNI技術開發so加密庫

以下是個人在做加密演算法庫時一些經驗總結,今天把它寫下來分享給大家,希望對大家以後再做類似的開發工作時能有所幫助,少走些彎路。

主要從以下5個方面進行闡述:

1. Openssl安裝,1.0.11.0.2使用時的區別

2. Linuxgcc的使用方法,及可能遇到的問題

3. JNI開發,開發流程

4. NDK使用方法,以及打包so庫時如何編寫Application.mk檔案

5.IOS打包基於openssl庫的靜態庫時需注意那些

一. Openssl安裝,1.0.11.0.2使用時的區別

參考網上的教程:

① openssl官網下載opensslopenssl-1.0.1e.tar.gz

② 使用

tar命令將其解壓到/usr/local/src

③ 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.11.0.2中有些方法的引數是不同的。例如1.0.1bio.h中有個方法BIO *BIO_new_mem_buf(void *buf, int len),而其在1.0.2中則是BIO *BIO_new_mem_buf(const void *buf, int len)。所以在打包時要注意,開發環境和打包環境中的庫是不是同一個版本,若不是需要在呼叫某些方法時稍作改動,一般使用指標型別強轉下就可以解決。

二. Linuxgcc的使用方法,及可能遇到的問題

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.ohello.c中不需要有main函式的實現,生成的.o檔案可以用於編譯動態庫或者是靜態庫。

gcc編譯基於openssl開發的.c檔案時,可能會遇到的問題

①  在編譯的階段提示找不到openssl/aes.h標頭檔案

原因:opensslinclude檔案未加入系統路徑,導致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檔案,#includehelloworld.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中一些常用的方法:

GetStringUTFCharsjstring轉換成為UTF-8格式的char*GetStringCharsjstring轉換成為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

① NDKandroid提供的用於編譯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的視訊教程噢!我整理了一份適