1. 程式人生 > >Android Studio通過JNI呼叫NDK程式

Android Studio通過JNI呼叫NDK程式

      NDK開發,其實是為了專案需要呼叫底層的一些C/C++的一些東西;另外就是為了效率更加高些,安全性更高。

如果你在Eclipse+ADT下開發過NDK就能體會到要麼是配置NDK還要下載Cygwin,配置Cygwin ,然後需要編譯生成,相當的蛋疼。要麼是直接用Eclipse開發,但是前期配置也是一堆;真心蛋疼。但是現在在AS上Eclipse能做到的這邊都OK。

(一) 通過jniaes案例說明呼叫NDK層配置過程

而我們通過底層來判斷簽名是否正確,如果正確則繼續執行核心程式碼,否則退出程式,這樣就可以防止別人惡意反編譯,並進行二次打包。

首先去官網下載一個最新的NDK,隨便放到哪都行,像我放在D:\Dev\Android\android-ndk-r10d.

(1) 新建一個專案:名稱JniAes

首先在java類中新增native介面,注意寫好native介面和System.loadLibrary()即可。程式碼如下:

1 public synchronized static native String getFromNativeIv();
2 public synchronized static native String getStringFromNative();
3 public synchronized static native int jniCheckAPP(Context context);
4 

然後build project得到其中中間檔案,我們關注的是.class檔案。編譯OK以後生成的class檔案在AS工程的如下目錄:

aes\app\build\intermediates\classes\debug\android\

(2)接下來跟class檔案生成相應的.h標頭檔案,執行如下命令即可

點選"View->Tool Windows->Terminal" 即在Studio中進行終端命令列工具.執行如下命令生成c語言標頭檔案.

javah
-d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms \android-16\android.jar;..\..\build\intermediates\classes\debug com.aes.jniaes.MainActivity

(3)然後將剛才的 .h檔案剪下過來。在jni目錄下新建一個c檔案,隨意取名,我的叫strk.c 。

strk.c檔案,用於實現核心程式碼邏輯,判斷包名.雜湊值是否合法,如果返回1,為合法。反之,則不合法。入口方法為:
jint Java_com_aes_jniaes_MainActivity_jniCheckAPP(JNIEnv* env, jobject context,
      jobject thiz)

接下來在工程的local.properties檔案中新增NDK路徑(上面下載好的那個NDK),類似其中的SDK路徑一樣,我的新增後如下:

sdk.dir=D\:\\Dev\\Android\\android-sdk-windows
ndk.dir=D\:\\Dev\\Android\\android-ndk-r10d

(4)接下來在app module目錄下的build.gradle中設定庫檔名(生成的so檔名)。找到gradle檔案的defaultConfig這項,在裡面新增如下內容:

 defaultConfig {
        applicationId "com.aes.jniaes"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "checkapp-jni"       //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86"   //輸出指定三種abi體系結構下的so庫。目前可有可無。
        }
    }

(5)最後就是新增靜態初始化loadLibrary程式碼,新增如下:

static {
         System.loadLibrary("checkapp-jni");    //so檔案的名字
       }

編譯出來的so檔案在aes\app\build\intermediates\ndk\debug\lib目錄下

二 . 引用so檔案

(1).在“src/main”目錄中新建名為“jniLibs”的目錄;

(2).將so檔案複製、貼上到“jniLibs”目錄內。

相關推薦

Android Studio通過JNI呼叫NDK程式

      NDK開發,其實是為了專案需要呼叫底層的一些C/C++的一些東西;另外就是為了效率更加高些,安全性更高。 如果你在Eclipse+ADT下開發過NDK就能體會到要麼是配置NDK還要下載Cygwin,配置Cygwin ,然後需要編譯生成,相當的蛋疼。要麼是直接用Eclipse開發,但是前期配置也是

Android通過JNI呼叫c++程式碼

一些說明 //查詢JNIAPI類,得到類的class,包名每級用/分隔 jclass clazz = env->FindClass("com/g/im/JNIAPI"); //通過類查詢靜態方法,得到方法的引用,callBackLogin為方法名稱,"Ljava/la

【走過巨坑】android studio對於jni呼叫及執行閃退無法載入庫的問題解決方案

相信很多小夥伴都在android開發中遇到呼叫jni的各種巨坑,因為我們不得不在很多地方用到第三方庫so檔案,然而第三方官方通常都只會給出ADT環境下的整合方式,而谷歌親兒子android studio預設採用的卻是gradle方式,與ADT編輯的方式大不相同,那再andorid studio中如何匯入so

NDK實戰教程(一) 在Android Studio執行第一個NDK程式

1、新建一個Android工程,這一步就不多說了; 2、在AndroidStudio中配置NDK路徑,方法是: (1)先下載NDK並安裝(這句基本是廢話); (2)點選單欄的File->ProjectStructure…->在開啟的視窗中左側選中SDKLocat

Android Studio 通過NDK呼叫OpenCV

所用as版本為2.0 ndk版本為r10d 安卓版本為5.0 系統為win10 opencv版本為3.1 首先新建一個工程 然後將sdk目錄下的native資料夾複製過來 然後在app/src/main資料夾下新建一個資料夾 叫做jni 再在這個資

Android開發 通過JNI實現JAVA與C/C++程式間的呼叫和回撥

       在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互呼叫。        Java Native Interface (JNI)標準是java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行

android實現app通過jni呼叫C/C++方法

本文實現在android app中使用呼叫jni庫呼叫本地C/C++方法。 1.新建android工程 2.新建java上層方法 本例子在工程中新建 cn.landsem.jnistudy 包,在其中新建TestManager類用於呼叫本地C/C++方法,該類的程式碼如下:

Android Studio開發jni例項詳解 (呼叫C程式碼例項)

FATAL EXCEPTION: main Process: com.example.jni.jnitest, PID: 30152 java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$Dele

android studio使用jni ndk會出現的問題

當我們在開發時需要用到包含本地方法的庫時,需要用ndk,會出現下列問題 1.可能會出現找不到ndk: Error:Execution failed for task ':serialPortLibrary:compileReleaseNdk'. > Error: Yo

Android Studio 工程 jni呼叫opencv庫

幾乎把網上的方法都試了個遍都不管用,不管是中文的還是stack overflow上的,(包括如在project structure裡新增module dependency,修改sourceSets.main.jni.srcDirs = [] 的方法等等),Jni裡都無法找到

Android studio執行JNI程式以及生成.so檔案(Windows下)

呼叫JNI中的方法展示出來的結果 生成的各個平臺的so庫的結果 下面開始進入主題 1、首先是要配置NDK(若是已經配置過NDK請略過此步驟) 建立NDK_HOME 再將配置好的NDK_HOME新增到PATH環境變數中 配置好之後可以測試是否配置正確 ,開啟cmd在裡面輸入ndk

為什麼Android Studio通過app打電話發簡訊時程式會崩潰

前段時間我在學習一個監聽本機來電狀態並將來電號碼資訊發至指定號碼的app,結果發現,程式碼完全沒錯,卻每次執行時都會結束程式。通過debug,我發現問題出在獲取手機來電狀態這個地方。可是明明在manifest裡面寫了Service那一行啊(android.permissio

android studiojni底層日誌的打印

添加 註意 erro ldl end 1.0 dto 字符 ati 1 添加ndk對log支持若需要添加ndk對log的支持,只需要通過以下2步即可實現。 1.1 修改Android.mk如生成的庫文件是“.so文件”,則在Android.mk中添加如下內容:LOCAL_L

android studio使用CMake和NDK,實現應用自身被卸載時打開某一網址

licensed 項目 右鍵 ava 開發工具 not per 2.0 idt 實現應用自身被卸載時打開某一網址的c代碼 MyActivity: public class MyActivity extends Activity { /** * Calle

Android studioJNI 開發實例

ndk create void 上層 執行效率 約束 添加 src 傳輸協議 在AS中進行 NDK 開發之前,我們先來簡單的介紹幾個大家都容易搞懵的概念: 到底什麽是JNI,什麽是NDK? 何為“交叉編譯”? 先看什麽是 JNI?JNI 的全稱就是

JNI入門教程1---Android studioJNI程式設計例項並生成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 studio 通過左滑右滑螢幕實現介面跳轉

[原始碼下載]https://download.csdn.net/download/weixin_42415553/10826919 巨集觀來說;我要實現四個介面的跳轉name就需要四個類 分別繼`承Fragment 在這四個類中分別重寫onCreateView,新增如下程式碼 Vie

Android studioJNI 開發例項

 在AS中進行 NDK 開發之前,我們先來簡單的介紹幾個大家都容易搞懵的概念:  到底什麼是JNI,什麼是NDK?  何為“交叉編譯”?     先看什麼是 JNI?JNI 的全稱就是 Java Native Interface,即java本地開發介面。可能大家和我一樣,一聽到介面什麼的就犯懵:“

Android Studio 通過一個登入功能介紹SQLite資料庫的使用

前言:         SQLite簡介:是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。