日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android studio 使用NDK工具实现JNI编程

發(fā)布時間:2025/7/14 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android studio 使用NDK工具实现JNI编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:

Android開發(fā)中常常會使用到第三方的.so庫。在使用.so庫的時候就要用到JNI編程。JNI是Java Native Interface的縮寫。它提供了若干的API實現(xiàn)了Java和其它語言的通信(主要是C&C++)。開發(fā)中一般都用第三方的庫,非常多時候也可能我們自己來編寫C或者C++來實現(xiàn)JNI編程,這篇博客主要是介紹Android studio 使用NDK工具來開發(fā)JNI編程。

環(huán)境配置

JNI編程須要滿足例如以下前提:

  • 你必須有安裝Android studio開發(fā)idea編輯器(本人使用的是android studio 1.3版本號)。

  • 下載最新版本號的NDK工具,然后解壓到一個文件夾就可以(配置NDK環(huán)境變量時使用到該路徑)。

    我的ndk版本號為 android-ndk-r10e

  • 配置ndk環(huán)境變量,計算機–>屬性–>高級系統(tǒng)設置–>環(huán)境變量–>系統(tǒng)變量–>新建 變量名:NDK_ROOT;變量值:F:\Android\SDK1\android2\android-ndk-r10e(此處是我的ndk路徑。換成你自己的ndk路徑就可以)。

  • 當然前提是你要配置了jdk環(huán)境變量,配置如同第三點:變量名:JAVA_HOME;變量值:F:\Android\SDK1\android2\Java\jdk1.7.0_67(此處是我的jdk路徑。換成你自己的jdk路徑就可以)。

    除此之外,你還得新建一個CLASSPATH環(huán)境變量,變量名:CLASSPATH;變量值為 .;%HOME_PATH%\lib; 一開始的 . 和;和最后的;都是須要的。

  • 你還須要在gradle.progerties文件下加入例如以下代碼
  • android.useDeprecatedNdk=true

    假設沒有gradle.progerties文件,請直接在當前project下新建該文件就可以。

    JNI編程

    1.新建JniUtils類。用來調(diào)用jni方法。代碼例如以下:

    package com.example.xjp.myjnidmoe;public class JniUtils { //載入靜態(tài)庫static {System.loadLibrary("Test");//此處載入的是對應的模塊庫,名稱必須和 ndk的moduleName名一樣。} //定義本地方法public native String getValue(); }

    2.Build 編譯當前project,最后會在build文件夾下生成例如以下文件

    該文件夾下生成了 JniUtils.class文件。

    然后打開AS的Terminal終端,跳到debug文件夾下:
    然后運行 javah -jni *(此處為你的目標文件路徑。即JniUtils路徑)

    最后會在debug文件夾以下生成 com_example_xjp_myjnidmoe_JniUtils.h 頭文件。代碼例如以下:

    /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_example_xjp_myjnidmoe_JniUtils */#ifndef _Included_com_example_xjp_myjnidmoe_JniUtils #define _Included_com_example_xjp_myjnidmoe_JniUtils #ifdef __cplusplus extern "C" { #endif /** Class: com_example_xjp_myjnidmoe_JniUtils* Method: getValue* Signature: ()Ljava/lang/String;*/ JNIEXPORT jstring JNICALL Java_com_example_xjp_myjnidmoe_JniUtils_getValue(JNIEnv *, jobject);#ifdef __cplusplus } #endif #endif

    以上代碼是自己主動生成的,無需開發(fā)人員去改動。

    3.在你的main文件夾下新建jni子文件夾。例如以下:
    將剛才生成的 .h頭文件拷貝到該jni文件夾下。然后新建一個 test.c文件,test.c文件代碼例如以下:

    // // Created by 850302 on 2016/4/26. //#include "com_example_xjp_myjnidmoe_JniUtils.h"JNIEXPORT jstring JNICALL Java_com_example_xjp_myjnidmoe_JniUtils_getValue(JNIEnv *env, jobject obj) {return (*env)->NewStringUTF(env, "This is my first JNI demo!"); }

    因為jni編程對方法的名稱有一定規(guī)則要求。開頭須要Java_ 后面依次是jni方法的java類路徑。以“_”切割。

    開發(fā)人員為了不寫錯,能夠直接將剛才的.h頭文件中的方法 copy下來直接實現(xiàn)就可以。

    4.配置Gradle文件
    首先你得配置當前project的 build.gradle文件,事實上配置非常easy,直接在原來的build.gradle文件中加入 ndk的配置就可以。

    apply plugin: 'com.android.application'android {compileSdkVersion 23buildToolsVersion "22.0.1"defaultConfig {applicationId "com.example.xjp.myjnidmoe"minSdkVersion 21targetSdkVersion 23versionCode 1versionName "1.0"//這里是配置ndkndk{//定義庫的模塊名稱。該名稱用于System.loadLibrary("Test")moduleName "Test" }}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}} }dependencies {compile fileTree(dir: 'libs', include: ['*.jar']) }

    是不是非常easy。不過定義了 ndk 的moduleName的名稱而已。

    其次是為當前project配置指定的ndk,配置方法例如以下:右鍵當前project名。選擇Open Module Settings。彈出例如以下窗體。
    如圖。1:sdk路徑;2:jdk路徑。3:ndk路徑;點擊ok之后。

    會在local.properties文件下配置指定的sdk和ndk路徑:

    #Tue Apr 26 18:36:18 CST 2016 ndk.dir=F\:\\Android\\SDK1\\android2\\android-ndk-r10e sdk.dir=F\:\\Android\\SDK1\\android2\\sdk

    如此,全部的準備工作都已經(jīng)完畢。如今能夠在你的代碼中使用Test庫了,調(diào)用代碼例如以下:

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView = (TextView) findViewById(R.id.text);//start=====JniUtils jniUtils = new JniUtils();String content = jniUtils.getValue();//end=====textView.setText(content);}

    結(jié)果例如以下:

    可能會有人問。代碼生成的libTest.so庫在哪里呢?事實上生成的libTest.so庫已經(jīng)打包到apk中去了,那么假如我要把這個so庫給別人使用怎么辦?非常easy,在你編譯的過程事實上已經(jīng)生成了libTest.so,在哪里呢?文件夾例如以下:bulid/intermediates/ndk文件夾下。該文件夾是編譯成功之后生成的。


    看到?jīng)]?生成了不同平臺下的libTest.so庫。

    總結(jié)

    該博客主要是記錄Android studio 下使用NDK工具實現(xiàn)JNI編程和生成so庫的整個過程。以便開發(fā)人員了解JNI編程的一個完整的過程。

    轉(zhuǎn)載于:https://www.cnblogs.com/lytwajue/p/7338966.html

    總結(jié)

    以上是生活随笔為你收集整理的Android studio 使用NDK工具实现JNI编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。