最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Android JNI的基本使用(CMake)

 更新時(shí)間:2017年12月25日 09:28:49   作者:許佳佳233  
本文介紹了Android JNI的基本使用(CMake),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

簡(jiǎn)介

什么是JNI

JNI的全稱是Java Native Interface:Java本地開(kāi)發(fā)接口,它提供了若干的API實(shí)現(xiàn)了Java和其他語(yǔ)言的通信(主要是C和C++),目的就是Java可以調(diào)用C或C++開(kāi)發(fā)的函數(shù),C或C++也能調(diào)用Java的方法。這樣有很多有點(diǎn),其一就是效率,C/C++是本地語(yǔ)言,比java更高效;其二就是可以復(fù)用已經(jīng)存在的C/C++代碼;其三是Java反編譯比C語(yǔ)言容易,一般加密算法都是用C語(yǔ)言編寫(xiě),不容易被反編譯。

什么是NDK和CMake

NDK全稱是Native Development Kit,NDK提供了一系列的工具,幫助開(kāi)發(fā)者快速開(kāi)發(fā)C(或C++)的動(dòng)態(tài)庫(kù),并能自動(dòng)將so和Java應(yīng)用一起打包成apk。NDK集成了交叉編譯器,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、ABI等差異,開(kāi)發(fā)人員只需要簡(jiǎn)單修改mk文件(指出“哪些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。

CMake是一個(gè)比make更高級(jí)的編譯配置工具,它可以根據(jù)不同平臺(tái)、不同的編譯器,生成相應(yīng)的Makefile或者vcproj項(xiàng)目。
通過(guò)編寫(xiě)CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過(guò)程。CMake自動(dòng)生成的Makefile不僅可以通過(guò)make命令構(gòu)建項(xiàng)目生成目標(biāo)文件,還支持安裝(make install)、測(cè)試安裝的程序是否能正確執(zhí)行(make test,或者ctest)、生成當(dāng)前平臺(tái)的安裝包(make package)、生成源碼包(make package_source)、產(chǎn)生Dashboard顯示數(shù)據(jù)并上傳等高級(jí)功能,只要在CMakeLists.txt中簡(jiǎn)單配置,就可以完成很多復(fù)雜的功能,包括寫(xiě)測(cè)試用例。如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。

使用流程

1、在java文件中創(chuàng)建本地方法
2、build項(xiàng)目后自動(dòng)生成“.h”文件
3、創(chuàng)建.cpp文件,實(shí)現(xiàn).h文件中的方法
4、配置Cmake文件,生成“.so”文件

筆者項(xiàng)目目錄如下:

測(cè)試實(shí)例

public class MyJNI {
  private static final String TAG=MyJNI.class.getName();
  @Test
  public void test(){
    JNITest jniTest=new JNITest();
    Log.d(TAG,jniTest.nativeCalculate(2)+"");
  }
}

1、調(diào)用native方法nativeCalculate,傳入?yún)?shù)2。
1、獲取java對(duì)象number,初始值為0。
2、調(diào)用java方法javajavaCalculate,傳入number值,獲得返回值10。
3、將返回值加上參數(shù)2,返回,獲得12。

最終效果如下:

創(chuàng)建本地方法

public class JNITest {

  private int number = 0;

  public int javaCalculate(int num){
    number=num+10;
    return number;
  }
  public native int nativeCalculate(int num);

  static {
    System.loadLibrary("jni_test");
  }
}

自動(dòng)生成“.h文件”

首先make Project,然后進(jìn)入到app\build\intermediates\classes\debug目錄下。

在終端輸入命令javah com.example.xujiajia_sx.jnitest.JNITest(即帶有native方法的類)

效果如下:

 

自動(dòng)生成的“.h”文件如下,可以根據(jù)自己要求對(duì)其重命名或者增減內(nèi)容。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_xujiajia_sx_jnitest_JNITest */

#ifndef _Included_com_example_xujiajia_sx_jnitest_JNITest
#define _Included_com_example_xujiajia_sx_jnitest_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   com_example_xujiajia_sx_jnitest_JNITest
 * Method:  nativeCalculate
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_example_xujiajia_1sx_jnitest_JNITest_nativeCalculate
 (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

創(chuàng)建cpp文件實(shí)現(xiàn)native方法

筆者cpp文件如下:

#include "jni_test.h"

JNIEXPORT jint JNICALL
Java_com_example_xujiajia_1sx_jnitest_JNITest_nativeCalculate(JNIEnv *env, jobject obj,jint num) {
  //獲取obj中對(duì)象的class對(duì)象
  jclass clazz = env->GetObjectClass(obj);
  //獲取clazz中的number字段的id
  jfieldID id_number = env->GetFieldID(clazz, "number", "I");
  jmethodID id_java_calculate=env->GetMethodID(clazz, "javaCalculate", "(I)I");
  //次獲取java中number的值
  jint number = env->GetIntField(obj, id_number);
  jint result=env->CallIntMethod(obj,id_java_calculate,number);

  env->SetIntField(obj,id_number,result+num);
  //再次獲取java中number的值并返回
  return env->GetIntField(obj, id_number);
}

主要邏輯是獲取到j(luò)ava中number的值,然后調(diào)用javaCalculate()方法,接著再加上這個(gè)native方法的參數(shù)num。

設(shè)置Cmake文件,生成”.so”文件

首先,在build.gradle中添加Cmake配置:

android {
  ...
  defaultConfig {
    ...
    externalNativeBuild {
      cmake {
        cppFlags ""
        //生成多個(gè)版本的so文件
        abiFilters 'armeabi','armeabi-v7a','x86'
      }
    }
  }
  buildTypes {
    ...
  }
  externalNativeBuild {
    cmake {
      path "CMakeLists.txt"
    }
  }
}

編寫(xiě)Cmake文件:

#CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
    jni_test

    # Sets the library as a shared library.
    SHARED

    # Provides a relative path to your source file(s).
    src/main/jni/jni_test.cpp)

include_directories(src/main/jni/)

find_library( # Sets the name of the path variable.
    log-lib

    # Specifies the name of the NDK library that
    # you want CMake to locate.
    log )

target_link_libraries( # Specifies the target library.
      # 制定目標(biāo)庫(kù).
      jni_test

      # Links the target library to the log library
      # included in the NDK.
      ${log-lib} )

配置完cmake,rebuild項(xiàng)目,即可以運(yùn)行test。“.so”文件生成如下:


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android通過(guò)bin二進(jìn)制程序調(diào)用jar原理

    Android通過(guò)bin二進(jìn)制程序調(diào)用jar原理

    最近在研究monkey測(cè)試,發(fā)現(xiàn)monkey測(cè)試的代碼都是JAVA編寫(xiě)的,通過(guò)編譯生成jar包,而我們?cè)趫?zhí)行測(cè)試時(shí)直接執(zhí)行/system/bin/monkey這個(gè)二進(jìn)制程序的,那么它是如何能調(diào)起java程序的呢,本文小編給大家介紹了Android通過(guò)bin二進(jìn)制程序調(diào)用jar原理,需要的朋友可以參考下
    2023-10-10
  • Android使用Notification實(shí)現(xiàn)寬視圖通知欄(二)

    Android使用Notification實(shí)現(xiàn)寬視圖通知欄(二)

    這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)寬視圖通知欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • android TextView不用ScrollViewe也可以滾動(dòng)的方法

    android TextView不用ScrollViewe也可以滾動(dòng)的方法

    這篇文章主要介紹了android TextView不用ScrollViewe也可以滾動(dòng)的方法,很簡(jiǎn)單實(shí)用的代碼,大家參考使用吧
    2013-11-11
  • Android 異步獲取網(wǎng)絡(luò)圖片并處理導(dǎo)致內(nèi)存溢出問(wèn)題解決方法

    Android 異步獲取網(wǎng)絡(luò)圖片并處理導(dǎo)致內(nèi)存溢出問(wèn)題解決方法

    Android異步獲取網(wǎng)絡(luò)圖片并處理圖片Out Of Memory內(nèi)存溢出如何解決呢?本文介紹了操作步驟,感興趣的朋友可以了解下或許對(duì)你有所幫助
    2013-02-02
  • Android入門(mén)之ProgressBar的使用教程

    Android入門(mén)之ProgressBar的使用教程

    Android里的ProgressBar默認(rèn)為一個(gè)不斷轉(zhuǎn)圈的圓,它也可以自定義。這篇文章主要通過(guò)示例和大家介紹下ProgressBar的使用,感興趣的可以了解一下
    2022-11-11
  • Android學(xué)習(xí)之SharedPerference存儲(chǔ)詳解

    Android學(xué)習(xí)之SharedPerference存儲(chǔ)詳解

    這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)之SharedPerference存儲(chǔ)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android實(shí)現(xiàn)滑動(dòng)加載數(shù)據(jù)的方法

    Android實(shí)現(xiàn)滑動(dòng)加載數(shù)據(jù)的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)滑動(dòng)加載數(shù)據(jù)的方法,實(shí)例分析了Android通過(guò)滑動(dòng)實(shí)現(xiàn)動(dòng)態(tài)加載數(shù)據(jù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Android屬性動(dòng)畫(huà)特點(diǎn)詳解

    Android屬性動(dòng)畫(huà)特點(diǎn)詳解

    這篇文章主要為大家詳細(xì)介紹了Android屬性動(dòng)畫(huà)特點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 理解Android中的自定義屬性

    理解Android中的自定義屬性

    這篇文章主要介紹了理解Android中的自定義屬性,在android相關(guān)應(yīng)用開(kāi)發(fā)過(guò)程中,固定的一些屬性可能滿足不了開(kāi)發(fā)的需求,所以需要自定義控件與屬性,本文將以此問(wèn)題進(jìn)行詳細(xì)介紹,需要的朋友可以參考下
    2016-01-01
  • Android實(shí)現(xiàn)原生分享功能

    Android實(shí)現(xiàn)原生分享功能

    這篇文章主要介紹了Android實(shí)現(xiàn)原生分享功能,只能分享文字和圖片,不能單獨(dú)分享圖片或者文字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評(píng)論

兖州市| 海林市| 舟曲县| 临泉县| 察哈| 宣恩县| 凤翔县| 津市市| 左权县| 温州市| 平塘县| 洪洞县| 西藏| 台南县| 报价| 延庆县| 房山区| 香港 | 苏州市| 阳谷县| 鄱阳县| 南昌市| 延寿县| 冀州市| 且末县| 蕲春县| 湖州市| 加查县| 昆明市| 平安县| 徐州市| 沽源县| 三原县| 柘荣县| 开原市| 桃源县| 荣成市| 白河县| 井陉县| 广元市| 延川县|