Android Studio jni開發入門——看我就夠了

1、環境配置

主要須要配置的就是NDK(Native Development Kit),如今Android studio很便利,能夠一鍵下載:
file → setting → 按截圖找到以下路徑 → 選擇NDK → 肯定應用下載java

NDK安裝android

  • 安裝完成之後就能夠開擼了

2、jni hello world!

1. 新建一個項目

  • 新建一個app,測試jni開發c++

2.設置支持jni

  • 打開gradle.properties,添加:
android.useDeprecatedNdk=true
  • 打開local.properties,添加:
ndk.dir=NDK的路徑
  • 最後打開app內build.gradle,在android/defaultConfig下面添加ndk配置
apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"
    defaultConfig {
        applicationId "com.lilei.testjni"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"


        ndk {
            moduleName "JNISample"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8'
    testCompile 'junit:junit:4.12'
}
  • moduleName 表示編譯出的so文件的名字

3.新建java訪問c層的接口類

  • 建立一個Jni的工具類,並定義接口函數,函數關鍵字用native(static用不用都可)
package com.lilei.testjni;

/**
 * Created by lilei on 2017/3/29.
 */

public class JniUtils {

    public static native String getJniString();

}
  • getJniString()方法即要與C層的交互的函數

4.生成頭文件

  • "make-project"編譯完成
  • 打開終端,運行
cd app/build/intermediates/classes/debug/
javah com.lilei.testjni.JniUtils

運行成功以後打開app/build/intermediates/classes/debug/ 便可找到編譯出的頭文件"com_lilei_testjni_JniUtils.h",不難發現頭文件名是有原報名+類名組成app

5.建立jni開發的文件夾

  • 點擊app文件夾,New → Folder → JNI Folder, 選擇在main文件夾下便可,生成成功後main目錄下會出現一個jni的文件夾
  • 找到剛纔生成到頭文件,複製到jni文件夾下(記得關閉剛纔使用的終端,不然沒法複製)
  • 頭文件有了,如今在jni目錄下建立一個C++文件用於開發使用,命名與頭文件相同
  • 編寫C++文件中定義函數的代碼
#include "com_lilei_testjni_JniUtils.h"

JNIEXPORT jstring JNICALL Java_com_lilei_testjni_JniUtils_getJniString
        (JNIEnv *env, jclass) {
    // new 一個字符串,返回Hello World
    return env -> NewStringUTF("Hello World");
}

6.java層加載so

  • 回到JniUtils,加上
static {
        System.loadLibrary("JNISample");
    }

加載soide

7.運行Run

  • 調用jni的函數
package com.lilei.testjni;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

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

        Log.i("Jni", JniUtils.getJniString());

    }
}
  • 至此就成功運行出jni的Hello World了函數

     

3、生成so文件

前文介紹如何運行C++程序,可是實際開發中大可能是封裝編譯出so文件後進行開發,就相似java裏面的jar包工具

1.配置NDK環境變量

  • 找到Android Studio安裝的NDK包的文件目錄(E:\AndroidStudioSDK\SDK\ndk-bundle),添加到系統的環境變量中

2.新建mk文件

  • 在jni目錄下新建Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := JNISample
LOCAL_SRC_FILES := com_lilei_testjni_JniUtils.cpp

include $(BUILD_SHARED_LIBRARY)
  • 在jni目錄下新建Application.mk文件
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++0x
APP_ABI := armeabi-v7a
APP_PLATFORM := android-18

3.編譯生成so

  • 打開終端cd到jni目錄下
  • 調用ndk-build開始編譯so
ndk-build
  • 運行無誤的話會如圖所示測試

    ndk-buildgradle

  • 運行成功以後即會看到main文件夾下多了libs和obj的文件夾,裏面就是生成的各類CPU的so文件ui

libs和obj裏面都有so文件,二者的區別google給出的解釋是:
As part of the build process, the files in the libs folder have been stripped of symbols and debugging information. So you'll want to keep two copies of each of your .so files: One from the libs folder to install on the Android device, and one from the obj folder to install for GDB to get symbols from.
也就是說,libs目錄下生成的庫是剝離了符號表與調試信息的,而obj下的庫是帶有調試信息的。

至此jni的開發入門已完成

4、jni經常使用類型和方法

  • jni也有本身特定的語法,完成入門教程的同窗想進階的話能夠查看這篇博客,該博主彙總收集了jni的經常使用方法和類型
相關文章
相關標籤/搜索