1. 程式人生 > >Android studio2.2+,配置NDK,JNI開發

Android studio2.2+,配置NDK,JNI開發

一,Android studio2.2+以上版本

2.2以上版本預設是配置了NDK的。在你android SDK目錄下的ndk-bundle下。

在我們專案下的local.properties下已經配置好NDK路徑了,如下(我的路徑)
ndk.dir=C:\forwork\java\Android\sdk\ndk-bundle
sdk.dir=C:\forwork\java\Android\sdk

新建工程,如下圖,勾選紅框選項c++ suport
這裡寫圖片描述

勾選了以後我們會發現新建的工程已經給我們配置好了NDK所需的環境,並且給我們建好了一個JNI的簡單例子。
因為我也勾選了kotlin support所以新建的專案是kotlin格式的。
這裡寫圖片描述


我們會發現在新建的專案中已經有了,native方法,和一個library直接執行,呼叫的就是cpp裡面的方法返回的String 字串。

二,建立自己的library

public class NativeActivity extends AppCompatActivity {
    static {
        System.loadLibrary("native-activity");
    }
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super
.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = findViewById(R.id.sample_text); textView.setText(helloFromC()); } public native String helloFromC(); }

我們新建一個Activity 並在裡面建立自己的native方法helloFormC()。這個時候會報錯,因為沒有這個方法,不用管,接下來生成我們自己的.h檔案。

開啟android studio 的Terminal控制檯,cd 到java目錄下 輸入命令:javah -d ../jni -jni com.xp.vedio.NativeActivity
“-d”後面是要生成檔案的目錄,jni後面是要生成的檔名字。回車以後 會在jni目錄下生成我們需要的.h檔案,發現之前的報錯沒有了。
這裡寫圖片描述

然後根據.h檔案,寫我們需要的.cpp檔案,跟.h檔案對應,.cpp檔案才是真正的方法實體檔案。

#include <jni.h>
#include <string>
#include "com_xp_vedio_NativeActivity.h"

extern "C" JNIEXPORT jstring

JNICALL
Java_com_xp_vedio_NativeActivity_helloFromC(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++ as NativeActivity";
    return env->NewStringUTF(hello.c_str());
}

.cpp檔案的方法名和.h檔案是對應的。後面發現不要.h檔案也是可以的。好處可能是方便些.cpp檔案方法把,畢竟.h是生成的。

最後一步:
在專案的CMakeLists.txt檔案,這個是新建專案的時候,自動給你生成的。我們需要在這個檔案下加入我們的.cpp檔案,讓他自己編譯。改檔案已經給了我們很友好的提示。

add_library( # Sets the name of the library.
             native-activity

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/jni/native-activity.cpp )

第一行使我們的.cpp檔名字,第二行分享改檔案,第三行檔案路徑。

target_link_libraries( # Specifies the target library.
                       native-lib
                       native-activity

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

在target_link_libraries加入自己的.cpp檔案。然後執行,就可以了。
如果不加入的上面東西的話,會造成找不到對應的.so檔案,會報錯。

最後點選studio的Build–》Make project會生成apk檔案。點選雙擊apk檔案
這裡寫圖片描述

對應的.so檔案已經生成,並且打包在apk檔案中。

執行,大功告成。
這裡寫圖片描述

之前因為NDK編譯的各種麻煩,都懶得去弄,現在發現android 對於 NDK的支援越來越好了。