編輯:Android資訊
Java Native Interface (JNI)標准是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI 是本地編程接口,它使得在 Java 虛擬機 (VM) 內部運行的 Java 代碼能夠與用其它編程語言(如 C、C++ 和匯編語言)編寫的應用程序和庫進行交互操作。
由於Android的應用層的類都是以Java寫的,這些Java類編譯為Dex型式的Bytecode之後,必須靠Dalvik虛擬機(VM: Virtual Machine)來執行。VM在Android平台裡,扮演很重要的角色。(多的咱不說了,介紹什麼的 到處都有可以去搜一下)
咱們先建一個NdkJniDemo的工程
新建JniUtils類實現native方法
public class JniUtils { public static native String getStringFormC(); }
然後clean project 再rebuild project 生成class文件,這時候打開如下圖的文件夾看是否生成了classes文件夾,沒有生成請重新來過。
再打開Terminal輸入指令cd app/build/intermediates/classes/debug
然後再輸入指令javah -jni com.wobiancao.ndkjnidemo.ndk.JniUtils
注意 這裡javah -jni後面跟的是JniUtils類的全路徑,如果javah報不存在之類的,是你的java環境沒有配置好。
這時候打開classes/debug下面的文件發現多了一個文件com_wobiancao_ndkjnidemo_ndk_JniUtils.h
然後在src/main下新建文件夾jni,把生成的.h文件復制或者剪切到jni文件夾下面去,新建一個c類隨便取一個名字,添加代碼如下
//// Created by XY on 16/1/4.//#include "com_wobiancao_ndkjnidemo_ndk_JniUtils.h"/* * Class: Java_com_wobiancao_ndkjnidemo_ndk_JniUtils * Method: getStringFormC * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_wobiancao_ndkjnidemo_ndk_JniUtils_getStringFormC (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"這裡是來自c的string");
這裡發現頭文件#include <jni.h>
報紅色,是因為咱們還沒有配置ndk環境,打開file->project structure
選擇你所下載的ndk環境路徑,如果沒有ndk這裡有個地址大家可以去下載 一個安卓工具集合的網站:http://androiddevtools.cn/
設置好了之後,發現頭文件還是紅色的,然後再build一下工程,就會有提示
Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set “android.useDeprecatedNdk=true” in gradle.properties to continue using the current NDK integration.
按著提示做就行了 在gradle.properties文件末尾添加android.useDeprecatedNdk=true
就ok啦
然後在app文件下得build.gradle ->defaultConfig括號內添加如下代碼
ndk { moduleName "NdkJniDemo" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫,目前可有可無。}
到了這一步重新build項目,發現已經沒有變紅了。接下來就是運用了,在JniUtils類裡面添加如下代碼
static { System.loadLibrary("NdkJniDemo");//之前在build.gradle裡面設置的so名字,必須一致}
然後簡單調用就行了,MainActivity代碼如下
public class MainActivity extends AppCompatActivity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.ndk_text); textView.setText(JniUtils.getStringFormC()); } }
運行結果如圖
咱們打開app->intermediates-ndk-debug發現生成了三個文件夾,並且對應了之前我們在build.gradle配置的abiFilters
大功告成。
新建libs文件夾把這三個文件夾放進去
然後刪除咱們的jni文件試試,是否工程還能運用?
ok 教程完畢
最後出一個利用jni的Aes加密demo運行結果如圖所示
項目地址:https://github.com/a12a15a05/NdkJniDemo
這一篇來分析一下HashMap的源碼,為了在後面講解Android緩存機制做准備,因為我們知道在Android的緩存機制中無論是用第三方的還是我們自己寫的,一般都
作為一名 Android 程序員,選擇一個好的 IDE 工具可以使開發變得非常高效,很多程序員喜歡使用 Google 的 Android Studio來進行開發,
1 背景 其實有點不想寫這篇文章的,但是又想寫,有些矛盾。不想寫的原因是隨便上網一搜一堆關於性能的建議,感覺大家你一總結、我一總結的都說到了很多優化注意事項,但是
一、問題描述 在開發中需要將信息轉換為二維碼存儲並要求帶有公司的logo,我們知道Google的Zxing開源項目就很好的幫助我們實現條形碼、二維碼的生成和解析,