Android studio 4.x在已有項目中集成jni

很久沒有寫jni相關的項目了碉渡,閑下來復習以下,把jni項目的構建流程記錄以下怖现,為以后使用方便查閱。

1. 環(huán)境配置

1. 下載NDK

方法一:在官網(wǎng)手動下載
image.png

選擇想要下載的對應系統(tǒng)NDK版本劝评,下載完成之后,解壓到你ndk存放目錄倦淀,這個目錄后續(xù)配置環(huán)境變量需要用到

方法二:使用Android studio SDK Manager下載(Android studio 4.x)

點擊Android studio 工具欄的

image.png
圖標或者根據(jù)路徑 File | Settings | Appearance & Behavior | System Settings | Android SDK或者Tool|SDK Manager打開SDK Manager 界面
image.png

選擇SDK Tools 條目蒋畜,勾選NDK和CMake后點擊apply按鈕等待下載完即刻
image.png

下載完成之后,ndk的位置在你的Android sdk目錄下方撞叽,有一個ndk的文件夾姻成。

2. 配置NDK

1.配置環(huán)境變量

打開高級環(huán)境變量控制

image.png

配置環(huán)境變量,在環(huán)境變量的Path中添加ndk的路徑
image.png

我的路徑是D:\Android\SDK\ndk\21.3.6528147
image.png

在cmd中輸入ndk-build 出現(xiàn)以下結果證明配置成功
image.png

2.已有項目中集成jni

1. 在Androidstudio中配置

打開已有項目愿棋,通過File|Project Structure|SDK location打開SDK和NDK配置界面科展,然后在ndk中配置你剛剛下載的NDK路徑

image.png

2. 在項目app目錄下的build.gradle文件進行配置

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.1"

    defaultConfig {
        applicationId "com.marlon.testjni"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        // 增加cmake控制屬性
        externalNativeBuild {
            cmake {
                // 指定編譯架構 可以省略
                abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
                // cpp 編譯時的額外選項 可以省略
                cppFlags ""
            }
        }
    }

    // 在android節(jié)點下
    // 指定CMakeLists.txt路徑
    externalNativeBuild {
        cmake {
            // 在該文件種設置所要編寫的c源碼位置,以及編譯后so文件的名字
            path "src/main/jni/CMakeLists.txt"
            // cmake版本 可以省略
            version "3.10.2"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

2. 新建JNI folder用來放置C/C++文件和CMakeLists文件

image.png

在app/src/main目錄下將會創(chuàng)建一個jni文件夾糠雨。

3. 新建HelloJNI文件

在src/main/java文件夾下面創(chuàng)建HelloJNI.java文件

package com.marlon.testjni;

/**
 * @author by marlon
 * @date on 2020/9/13.
 */

public class HelloJNI {

    static {
        System.loadLibrary("native-lib");
    }

    public static native String helloJNI();

}

4.創(chuàng)建native-lib文件

src/main/java 目錄下創(chuàng)建native-lib.cpp

//
// Created by marlon on 2020/9/13.
//
#include <jni.h>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_marlon_testjni_HelloJNI_helloJNI(JNIEnv *env, jclass clazz) {
    // TODO: implement helloJNI()
    return env->NewStringUTF("Hello From JNI!");
}

5. 創(chuàng)建CMakeLists文件

在src/main/jni文件中創(chuàng)建

# 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.

#指定CMake構建本地庫時所需的最小版本
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.
            #將資源文件生成動態(tài)鏈接庫(so文件)的庫名稱(文件名稱:“l(fā)ib" +設置的名稱)
             native-lib

             # Sets the library as a shared library.

             SHARED

             # Provides a relative path to your source file(s).
             native-lib.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.
                       #將所有的add_library中的庫鏈接起來才睹,有多少個add_library成的庫就將其添加到這里
                       #這個和add_library中的指定的so庫名稱一致
                       native-lib

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

3.使用

package com.marlon.testjni;

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //在這里直接調用
                String string = HelloJNI.helloJNI();
                Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
            }
        });
    }
}

整個就是這樣

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甘邀,隨后出現(xiàn)的幾起案子琅攘,更是在濱河造成了極大的恐慌,老刑警劉巖松邪,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坞琴,死亡現(xiàn)場離奇詭異,居然都是意外死亡逗抑,警方通過查閱死者的電腦和手機剧辐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邮府,“玉大人荧关,你說我怎么就攤上這事」涌” “怎么了羞酗?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長紊服。 經(jīng)常有香客問我,道長胸竞,這世上最難降的妖魔是什么欺嗤? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮卫枝,結果婚禮上煎饼,老公的妹妹穿的比我還像新娘。我一直安慰自己校赤,他們只是感情好吆玖,可當我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布筒溃。 她就那樣靜靜地躺著,像睡著了一般沾乘。 火紅的嫁衣襯著肌膚如雪怜奖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天翅阵,我揣著相機與錄音歪玲,去河邊找鬼。 笑死掷匠,一個胖子當著我的面吹牛滥崩,可吹牛的內容都是我干的。 我是一名探鬼主播讹语,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼钙皮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了顽决?” 一聲冷哼從身側響起短条,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎擎值,沒想到半個月后慌烧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鸠儿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年屹蚊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片进每。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡汹粤,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情脂崔,我是刑警寧澤悦冀,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站芹壕,受9級特大地震影響,放射性物質發(fā)生泄漏接奈。R本人自食惡果不足惜踢涌,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望序宦。 院中可真熱鬧睁壁,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钳降,卻和暖如春厚宰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牲阁。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工固阁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人城菊。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓备燃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凌唬。 傳聞我的和親對象是個殘疾皇子并齐,可洞房花燭夜當晚...
    茶點故事閱讀 43,435評論 2 348