Android NDK初探

什么是NDK?

NDK 是 Native Development Kit 的縮寫,是 Android 的工具開發(fā)包。它的作用是快速開發(fā) C/C++ 的動(dòng)態(tài)庫,并自動(dòng)將動(dòng)態(tài)庫與應(yīng)用一起打包到 apk。NDK 是屬于 Android 的,與 Java 無直接關(guān)系。NDK 是 Android 中實(shí)現(xiàn) JNI 的手段。那么什么是JNI呢?

什么是JNI

JNI 是 Java Native Interface 的縮寫,即 Java 的本地接口,是java與c語言等其他語言通信的橋梁。目的是使得 Java 與 C/C++進(jìn)行交互。

開始實(shí)戰(zhàn)

1.新建native方法

package com.sunql.ndkfrist;
public class JniLoader {
    static {
        System.loadLibrary("demo-lib");
    }
    public native String stringFromJNI();

    public native String logFormJni();
}

2.創(chuàng)建jni目錄,生成jni文件,生成文件代碼如下
3.javah
-jni 生成進(jìn)頭文件
-d 輸出目錄
-classpath <path> 加載引用路徑
命令:
(1)進(jìn)入項(xiàng)目根目錄
(2)找到sdk/platforms/android-16/android.jar
(3)javah -classpath bin/classes ;../sdk/platforms/android-16/android.jar -d jni packeageName.className 生成jni文件目錄
javah -d jni -classpath F:\Android\Sdk\platforms\android-28\android.jar;....\build\intermediates\classes\debug com.sunql.ndkfrist.J
NITest
4.創(chuàng)建實(shí)體類.c 文件 ,引入生成的jni頭文件。

#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_sunql_ndkfrist_JniLoader_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

5.引入Android.mk文件 ,加入編譯的文件配置。
build.gradle配置詳情展示:

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.sunql.ndkfrist"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                // 默認(rèn)是 “ cppFlags "" ”
                // 如果要修改 Customize C++ Support 部分,可在這里加入
                cppFlags "-frtti -fexceptions"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jni/'] } }
}

CMakeLists.txt配置文件如下:

cmake_minimum_required(VERSION 3.4.1)

add_library(demo-lib
             SHARED
             src/main/cpp/demo-lib.cpp )
add_library(test-demo
             SHARED
             src/main/cpp/test-demo.cpp )

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(demo-lib
                       ${log-lib} )
target_link_libraries(test-demo
                       ${log-lib} )

6.根目錄命令:ndk-build命令生成.so文件。使用android studio開發(fā)生成的.so文件會(huì)直接在build目錄下的intermediates\cmake\debug\obj\arm64-v8a目錄中。復(fù)制.so文件到其他項(xiàng)目的lib中就可以調(diào)用.so中的API方法了。


image.png

7.初始化jni類,調(diào)用完成。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JniLoader jniLoader=new JniLoader();
        String string=  jniLoader.stringFromJNI();
        TextView textView=findViewById(R.id.textview);
        if (!TextUtils.isEmpty(string)){
            textView.setText(string);
        }else {
            textView.setText("獲取null");
        }
    }
}

項(xiàng)目代碼:

https://github.com/sunql0827/NdkFrist

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容