Android Studio JNI調(diào)用

https://developer.android.google.cn/ndk/guides/index.html
原生開發(fā)工具包 (NDK) 是一組可讓您在 Android 應(yīng)用中利用 C 和 C++ 代碼的工具。 可用以從您自己的源代碼構(gòu)建,或者利用現(xiàn)有的預(yù)構(gòu)建庫。

NDK 不適用于大多數(shù)初學(xué)的 Android 編程者,對許多類型的 Android 應(yīng)用沒什么價值。 因為它不可避免地會增加開發(fā)過程的復(fù)雜性,所以通常不值得使用。 但如果您需要執(zhí)行以下操作,它可能很有用:

從設(shè)備獲取卓越性能以用于計算密集型應(yīng)用,例如游戲或物理模擬。
重復(fù)使用您自己或其他開發(fā)者的 C 或 C++ 庫。

下載地址:
https://developer.android.google.cn/ndk/downloads/index.html

編譯環(huán)境:

gradle 2.1

dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
    }

NDK版本

android-ndk-r13b-windows-x86_64
谷歌中國下載

Android Studio 2.0版本

設(shè)置NDK目錄
File —> Project Structure —> SDK Location —> Android NDK location

環(huán)境配置

1,在項目根目錄下的gradle.properties文件里添加

android.useDeprecatedNdk=true

2,在項目根目錄下的local.properties文件里添加ndk的目錄

ndk.dir=D\:\\work\\android-ndk-r13b-windows-x86_64

3,在項目app目錄下的build.gradle文件里添加如下片段

android {
    ...

    defaultConfig {
        ...
        
        ndk {
            moduleName "Sample" //模塊名稱,對應(yīng)的動態(tài)鏈接庫名稱libSample
            ldLibs = ["log"] //在JNI打log 必須加上log,否則會報錯log函數(shù)未定義
        }

    }
}

編譯工程

1,創(chuàng)建一個類,編寫本地方法,加載so庫

package com.starry.jni;

public class JNISample {
    
    static {
        System.loadLibrary("Sample");
    }

    public native String getString();
}

2,生成頭文件,打開Android Studio Terminal窗口(左下角),輸入以下指令

cd  app/src/main/java  //進入到j(luò)ava目錄
javah -jni com.starry.jni.JNISample //生成 點h文件

3,新建jni目錄,右鍵工程下的app目錄 —> Folder —> JNI Folder —> New Android Component —> Finish,默認是會在app/src/main目錄下生成jni目錄

4,把第二步生成的com_starry_jni_JNISample.h文件拷貝至第三步生成的jni目錄下

5,右鍵jni目錄,New —> C/C++ Source File,新建與頭文件相同名稱的cpp文件com_starry_jni_JNISample.cpp,完整代碼如下

#include "com_starry_jni_JNISample.h"

JNIEXPORT jstring JNICALL Java_com_starry_jni_JNISample_getString (JNIEnv *env, jobject obj){

    return env -> NewStringUTF("我來自JNI");
}

6,在Activity里調(diào)用,代碼如下

...
JNISample jniSample = new JNISample();
String string = jniSample.getString();
...

7,重新編譯下工程或直接布署代碼到手機上,成功就會在app/build/intermediates/ndk/debug/lib目錄下生成相應(yīng)的so庫文件

8,示例代碼下載

注:
1,JNISample類里邊不能用中文件字符
2,我的NDK是從官網(wǎng)下載的,使用Android Studio提供的NDK死活編譯不過
3,cpp文件和h文件名稱可以自定義,但是最好按照ndk生成的格式命名,方法命名必須按照生成的頭文件里的規(guī)范命名(Java_包名_類名_方法名稱)
4,D:\work\android-ndk-r13b-windows-x86_64\platforms\android-22\arch-arm\usr\include目錄里包含了ndk開發(fā)所有使用到的頭文件,做jni開發(fā)可以查看jni.h頭文件里提供函數(shù)。
5,點擊右上角Gradle —> 當前項目 —> app —> Tasks —> Build —> assembleRelease,打包完成,.so文件會自動拷貝到lib目錄下,不需要手動拷貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容