Android Studio JNI 開(kāi)發(fā)簡(jiǎn)單案例(android studio開(kāi)發(fā)java)
進(jìn)程?;?,熱修復(fù),硬件接入等等都需要底層的支持,而底層代碼是 C 、C 寫的,那么在 Android 中怎么調(diào)用底層的庫(kù)呢?這里就需要了解 JNI 技術(shù)。
Android Studio 出來(lái)兩年多了,網(wǎng)上針對(duì) AS 開(kāi)發(fā) JNI 工程資源比較少,針對(duì)于此,我特意寫下本篇博客,希望能對(duì)大家有所幫助。
配置環(huán)境
下載NDK 請(qǐng)點(diǎn)擊這里 ,并進(jìn)行環(huán)境配置,如圖:
項(xiàng)目關(guān)聯(lián)NDK ,具體操作如圖:
右鍵你的工程項(xiàng)目,選擇 【Open Module Settings】
在 【Android NDK location】配置 NDK 的按著目錄:
最后在 項(xiàng)目根目錄 【gradle.properties】 下加上:
1 | android.useDeprecatedNdk=true |
如圖:
JNI實(shí)現(xiàn)
新建 JNI_DEMO 項(xiàng)目,完成以上的配置工作。我的項(xiàng)目路徑為:D:Android_Study_DemosJNI_DEMO
生成 .h 文件
新建TestJNI類
12345 | public class TestJNI { public native String HelloWord(String str); } |
在cmd命令下面,cd到j(luò)ava目錄,輸入javah -jni com.github.jni_demo.TestJNI命令,生成 .h 文件:
注意:com.github.jni_demo.TestJNI 不能 cd com , cd github……否則編譯不成功。
你會(huì)發(fā)現(xiàn)在你的java路勁下生成了com_github_jni_demo_TestJNI.h文件:
123456789101112131415161718192021 | /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_github_jni_demo_TestJNI */ #ifndef _Included_com_github_jni_demo_TestJNI #define _Included_com_github_jni_demo_TestJNI #ifdef __cplusplus extern "C" { #endif /* * Class: com_github_jni_demo_TestJNI * Method: HelloWord * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif |
然后右鍵 app >New> Folder > JNI Folder 生成jni目錄如圖:
然后拷貝com_github_jni_demo_TestJNI.h到j(luò)ni目錄下面:
生成 .C 文件
右鍵jni,生成com_github_jni_demo_TestJNI.cpp文件:
拷貝以下代碼到 .cpp 文件中:
1234567 | #include <stdio.h> #include <stdlib.h> #include "com_github_jni_demo_TestJNI.h" JNIEXPORT jstring JNICALL Java_com_github_jni_1demo_TestJNI_HelloWord (JNIEnv *env, jobject, jstring str) { return str; } |
build.gradle 配置 ndk
在defaultConfig節(jié)點(diǎn)下加入如下代碼:
1234 | ndk { moduleName "TestJNI" abiFilters "armeabi", "armeabi-v7a", "x86" } |
點(diǎn)擊 Build > Make Project 如圖:
編譯成功后,打開(kāi) build > intermediates > ndk > debug > lib 下查看生成的 .so 文件:
Java中調(diào)用JNI
記得把生成的 .so 文件拷貝到項(xiàng)目的 libs 目錄下:
接著在Java中調(diào)用JNI:
123456789101112131415161718 | package com.github.jni_demo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; public class MainActivity extends AppCompatActivity { static { // 加載動(dòng)態(tài)庫(kù) System.loadLibrary( "TestJNI" ); } @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); TestJNI testJNI= new TestJNI(); Log.e( "---------------" , "************" testJNI.HelloWord( "恭喜你,調(diào)用成功!" )); } } |
這樣你就生成了一個(gè)屬于自己的 .so 文件。
..