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

詳解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅

 更新時間:2017年12月04日 09:22:05   作者:KissDream  
這篇文章主要介紹了詳解AndroidStudio JNI +Gradle3.0以上JNI爬坑之旅,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1.首先什么是JNI呢?

JNI——(Java Native Interface),他是java平臺的特性,不是安卓系統(tǒng)提供的。他定義了一些JNI函數(shù),來讓開發(fā)者可以通過調(diào)用這些函數(shù)來實(shí)現(xiàn)java代碼調(diào)用C/C++代碼。

2.如何使用JNI呢?

我們先將寫好的C/C++代碼編譯成對應(yīng)平臺的動態(tài)庫(windows是.dll文件,linux是.so文件)。

下面我們來舉個栗子:使用AndroidStudio來實(shí)現(xiàn)JNI

3.要實(shí)現(xiàn)JNI先下載NDK,那么NDK又是什么呢?(面試寶典來了,趕緊掏出小本本)

  1. NDK是一系列工具的集合
  2. NDK提供了一份穩(wěn)定、功能有限的API頭文件聲明
  3. NDK的發(fā)布,使“Java+C”的開發(fā)方式終于轉(zhuǎn)正,成為官方支持的開發(fā)方式
  4. NDK將使Android平臺支持C開發(fā)的開端
  5. 好,那接下來我們來下載NDK,有倆種方式:
  6. Google官方下載NDK:點(diǎn)擊下載
  7. 通過SDKManager來下載NDK:

 

4.下來我們new一個新工程:這個工程只包含一個MainActivity

 

5.我們來檢查一下NDK下載好了沒有,怎么檢查呢?如下:

檢查SDK Location里面的NDK路徑:

 

檢查local.properties文件里面有沒有NDK路徑:

 

6.下來我們要編寫JNI接口啦,如下:

JNI接口需要用native關(guān)鍵字修飾,我們會看到方法名報(bào)紅,沒關(guān)系,我們繼續(xù)

 

7.我們先build一下工程,檢查myJNIUtils.java編譯后有沒有生成class文件,在這個位置下:

AndroidJNITest/app/build/intermediates/classes/debug/com/kissdream/androidjnitest/myJNIUtils.class

 

8.使用javah生成.h頭文件,具體如下:

打開Terminal,輸入命令進(jìn)入到debug目錄下,命令如下:

cd/Users/apple/Desktop/AndroidJNITest/app/build/intermediates/classes/debug

然后使用javah+包名+文件路徑來生成頭文件,命令如下:

javah com.kissdream.androidjnitest.myJNIUtils

 

檢查頭文件有沒有生成:

我們發(fā)現(xiàn)這個路徑下多了個.h文件AndroidJNITest/app/build/intermediates/classes/debug/com/kissdream

哈哈,沒錯這個就是我們要生成的頭文件

 

9.生成了.h文件還不行,只是聲明了方法,我們還需要去實(shí)現(xiàn)它,那么如何去實(shí)現(xiàn)他呢,如下:

-我們在main下新建一個jni文件夾,如圖:

 

 

.h文件內(nèi)容如下:

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

#ifndef _Included_com_kissdream_androidjnitest_myJNIUtils
#define _Included_com_kissdream_androidjnitest_myJNIUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:   com_kissdream_androidjnitest_myJNIUtils
 * Method:  getName
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_kissdream_androidjnitest_myJNIUtils_getName
 (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

把生成的.h文件拷貝到j(luò)ni文件夾下

在jni文件夾下,新建一個.c(c語言)或者.cpp(c++)的文件,來實(shí)現(xiàn).h文件里聲明的方法:

把.h文件里面聲明的方法拷貝到新建的c++文件里面,然后在文件里面引入.h文件:

引入.h文件#include "com_kissdream_androidjnitest_myJNIUtils.h"

#include "com_kissdream_androidjnitest_myJNIUtils.h"
JNIEXPORT jstring JNICALL Java_com_kissdream_androidjnitest_myJNIUtils_getName
    (JNIEnv * env, jobject obj){
//如果是用C語言格式就用這種方式
//  return (*env)->NewStringUTF(env,"Kiss dream");
  //如果是用C語言格式就用這種方式
return env->NewStringUTF((char *)"Kiss dream");
}

 

到這里我們的方法就實(shí)現(xiàn)完畢了

10.方法我們實(shí)現(xiàn)了,但是我們?nèi)绾握{(diào)用呢,不要著急,F(xiàn)ollow me:

首先引入動態(tài)庫:

public class myJNIUtils {
  static {
    //名字注意,需要跟你的build.gradle ndk節(jié)點(diǎn)下面的名字一樣
    System.loadLibrary("NameProvider");
  }
  //JNI接口需要用native關(guān)鍵字修飾
  public native String getName();
}

NameProvider就是你要生成d的.so文件的文件名

下面我們來調(diào)用它

 

11.最重要的一步來了,生成so文件:

這個小編也不會,于是就去百度了下,得到結(jié)果:

在根目錄gradle.properties下面加上:

android.useDeprecatedNdk=true意思就是允許使用低版本的NDK

在module下面的build.gradle下面加上ndk節(jié)點(diǎn)如下圖:

ndk {
    moduleName "NameProvider"
  }

NameProvider注意這個名字要跟你引入動態(tài)庫的名字一樣

需要這倆步就可以運(yùn)行生成so文件了

然兒,并沒有想象的那么順利,報(bào)錯了,我頓時心中飛過一萬只草泥瑪,上log:

Error:Execution failed for task ':app:compileDebugNdk'.
> Error: Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio. Please switch to a supported build system.
 Consider using CMake or ndk-build integration. For more information, go to:
  https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile
  To get started, you can use the sample ndk-build script the Android
  plugin generated for you at:
  /Users/apple/Desktop/AndroidJNITest/app/build/intermediates/ndk/debug/Android.mk
 Alternatively, you can use the experimental plugin:
  https://developer.android.com/r/tools/experimental-plugin.html
 To continue using the deprecated NDK compile for another 60 days, set 
 android.deprecatedNdkCompileLease=1512283120054 in gradle.properties

百思不得其姐啊,百度的答案大家都是這樣做啊,為什么人家可以我的就不行呢,我的代碼和他的一模一樣啊

為什么人家可以我的就不行呢,我的代碼和他的一模一樣啊這句話作為程序員的我們很熟悉!難到我要放棄嗎?no no no,作為程序員的我怎么能輕言放棄呢!每個人都有這樣的經(jīng)歷,藍(lán)瘦過、香菇過,到最后我們都找到我們的錯誤

來我們仔細(xì)看下Log,大概意思就是說:

  1. android.useDeprecatedNdk不再支持了
  2. 讓使用CMake or ndk-build
  3. 然后還有鏈接

考慮使用CMake或ndk構(gòu)建集成。要了解更多信息,請?jiān)L問:

https://d.android.com/r/studio-ui/add-native-code.html#ndkCompile

首先,您可以使用Android的ndk構(gòu)建腳本示例插件為您生成:

/Users/apple/Desktop/AndroidJNITest/app/build/intermediates/ndk/debug/Android.mk

或者,你可以使用實(shí)驗(yàn)插件:

https://developer.android.com/r/tools/experimental-plugin.html

繼續(xù)使用已棄用的NDK編譯60天,設(shè)置

在gradle.properties

android.deprecatedNdkCompileLease = 1512283120054(這個測試不起作用)

經(jīng)過各種查資料,發(fā)現(xiàn)原來在gradle3.0以上以前這種方法不在支持

學(xué)習(xí)過程就不詳細(xì)描述了,直接上結(jié)果:

先通過SDKManager下載:CMake和LLDB

 

在build.gradle的defaultConfig節(jié)點(diǎn)下加入:

// 使用Cmake工具
    externalNativeBuild {
      cmake {
        cppFlags ""
        //生成多個版本的so文件
        abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
      }
    }

在build.gradle的android節(jié)點(diǎn)下加入:

// 配置CMakeLists.txt路徑
  externalNativeBuild {
    cmake {
      path "CMakeLists.txt"  // 設(shè)置所要編寫的c源碼位置,以及編譯后so文件的名字
    }
  }

 

添加CMakeLists.txt文件到build.gradle文件同級目錄下,具體內(nèi)容如下:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.
#CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
      # 設(shè)置so文件名稱.
       NameProvider

       # Sets the library as a shared library.
       SHARED
       # 設(shè)置這個so文件為共享.

       # Provides a relative path to your source file(s).
       # 設(shè)置這個so文件為共享.
       src/main/jni/getName.cpp)

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

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 )

# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

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

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

 

至此,我們所有的流程都做完了,下面來檢查一下我們的成果,見證奇跡的時候到了:

 

可以看到我們已經(jīng)成功生成so文件,再來上個效果圖:

 

下載地址:點(diǎn)擊下載Demo

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

相關(guān)文章

  • Android利用方向傳感器獲得手機(jī)的相對角度實(shí)例說明

    Android利用方向傳感器獲得手機(jī)的相對角度實(shí)例說明

    下面以實(shí)例向大家介紹喜愛Android利用方向傳感器獲得手機(jī)的相對角度,不了解的朋友可以參考下
    2013-06-06
  • Android基于Fresco實(shí)現(xiàn)圓角和圓形圖片

    Android基于Fresco實(shí)現(xiàn)圓角和圓形圖片

    這篇文章主要為大家詳細(xì)介紹了Android基于Fresco實(shí)現(xiàn)圓角和圓形圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android編程獲取地理位置的經(jīng)度和緯度實(shí)例

    Android編程獲取地理位置的經(jīng)度和緯度實(shí)例

    這篇文章主要介紹了Android編程獲取地理位置的經(jīng)度和緯度實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android操作系統(tǒng)服務(wù)調(diào)用GPS實(shí)現(xiàn)定位的相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android中的腦殘?jiān)O(shè)計(jì)總結(jié)

    Android中的腦殘?jiān)O(shè)計(jì)總結(jié)

    本篇文章是對Android中的腦殘?jiān)O(shè)計(jì)進(jìn)行了分析與介紹,需要的朋友參考下
    2013-05-05
  • Listview中Button搶占焦點(diǎn)的解決方法

    Listview中Button搶占焦點(diǎn)的解決方法

    在程序開發(fā)中經(jīng)常見到listview button搶占焦點(diǎn)的問題,怎么回事什么原因呢?下面小編給大家?guī)砹薒istview中Button搶占焦點(diǎn)的解決方法,感興趣的朋友一起看下吧
    2016-08-08
  • Android項(xiàng)目中使用HTTPS配置的步驟詳解

    Android項(xiàng)目中使用HTTPS配置的步驟詳解

    這篇文章主要給大家介紹了關(guān)于Android項(xiàng)目中使用HTTPS配置步驟的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • Android自定義ScrollView實(shí)現(xiàn)阻尼回彈

    Android自定義ScrollView實(shí)現(xiàn)阻尼回彈

    這篇文章主要為大家詳細(xì)介紹了Android自定義ScrollView實(shí)現(xiàn)阻尼回彈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Android中用RxJava和ViewPager實(shí)現(xiàn)輪播圖

    Android中用RxJava和ViewPager實(shí)現(xiàn)輪播圖

    現(xiàn)在App中實(shí)現(xiàn)一個輪播圖已經(jīng)是很多產(chǎn)品的標(biāo)配了,這篇文章給大家詳細(xì)介紹了如何利用RxJava和ViewPager實(shí)現(xiàn)輪播圖,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • kotlin中object關(guān)鍵字的三種使用場景

    kotlin中object關(guān)鍵字的三種使用場景

    這篇文章主要給大家介紹了關(guān)于kotlin中object關(guān)鍵字的三種使用場景,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用kotlin具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Android實(shí)現(xiàn)對圖片放大、平移和旋轉(zhuǎn)的功能

    Android實(shí)現(xiàn)對圖片放大、平移和旋轉(zhuǎn)的功能

    現(xiàn)在很多App在查看一張圖片的原圖時,都會支持圖片的手勢縮放,手勢平移以及圖片旋轉(zhuǎn)的操作。那么今天小編就來教大家去簡單的實(shí)現(xiàn)圖片的放大、平移、旋轉(zhuǎn)的操作,有需要的可以參考借鑒。
    2016-08-08

最新評論

青海省| 张掖市| 莱芜市| 外汇| 定远县| 平潭县| 敖汉旗| 红安县| 安岳县| 吴川市| 招远市| 嵊州市| 上饶县| 南平市| 平山县| 姚安县| 贵溪市| 辽宁省| 岢岚县| 黑水县| 肇源县| 论坛| 永兴县| 清徐县| 剑阁县| 鄱阳县| 称多县| 陆河县| 溧阳市| 潮州市| 班玛县| 洪泽县| 东安县| 南郑县| 南丰县| 奇台县| 阜南县| 武穴市| 凯里市| 四子王旗| 湛江市|