成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

詳解AndroidJNI的基本使用(CMake)

簡介

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都網(wǎng)站設計、網(wǎng)站建設、三江侗網(wǎng)絡推廣、微信小程序開發(fā)、三江侗網(wǎng)絡營銷、三江侗企業(yè)策劃、三江侗品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供三江侗建站搭建服務,24小時服務熱線:13518219792,官方網(wǎng)址:jinyejixie.com

什么是JNI

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

什么是NDK和CMake

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

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

使用流程

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

筆者項目目錄如下:

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

測試實例

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、調用native方法nativeCalculate,傳入?yún)?shù)2。
1、獲取java對象number,初始值為0。
2、調用java方法javajavaCalculate,傳入number值,獲得返回值10。
3、將返回值加上參數(shù)2,返回,獲得12。

最終效果如下:

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

創(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");
  }
}

自動生成“.h文件”

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

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

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

效果如下:

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

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

/* 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文件實現(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中對象的class對象
  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);
}

主要邏輯是獲取到java中number的值,然后調用javaCalculate()方法,接著再加上這個native方法的參數(shù)num。

設置Cmake文件,生成”.so”文件

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

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

編寫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.
      # 制定目標庫.
      jni_test

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

配置完cmake,rebuild項目,即可以運行test?!?so”文件生成如下:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

新聞名稱:詳解AndroidJNI的基本使用(CMake)
URL鏈接:http://jinyejixie.com/article26/jjepcg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站網(wǎng)站設計公司、網(wǎng)站建設、品牌網(wǎng)站建設、用戶體驗

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設網(wǎng)站維護公司
宜兴市| 邛崃市| 苍溪县| 道真| 乌鲁木齐市| 微山县| 镇赉县| 张家口市| 竹溪县| 蛟河市| 多伦县| 南溪县| 那坡县| 图们市| 西和县| 新昌县| 宁明县| 亚东县| 涿州市| 闽清县| 社旗县| 平果县| 伊宁市| 墨玉县| 微博| 汤原县| 景德镇市| 莫力| 梓潼县| 潞西市| 凤凰县| 廉江市| 宜昌市| 南通市| 古交市| 楚雄市| 筠连县| 明水县| 会宁县| 美姑县| 鄂伦春自治旗|