androidStudio 下 jni開發之初體驗

   1.首先,你需要下載Ndk。下載完成後解壓到任意目錄即可(路徑中不要帶有中文字符)。我的就直接放在F盤的目錄下:

 2.在AS中爲你的項目配置NDK。首先新建一個Android工程JNIDemo,Ctrl + shift + alt + s打開Project Structrue把我們剛纔下載好的NDK配置進去,點擊OK。

 3.配置好NDK後,簡單的爲我們的項目佈局文件添加一個TextView和一個Button,當點擊Button的時候,我們通過調用底層自己寫好的C/C++代碼來返回一個字符串,最後呈現在TextView上。

activity_main.xml佈局代碼:


```
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        />
    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button"/>
</LinearLayout>
```
MainActivity.java
```
public class MainActivity extends AppCompatActivity {

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

        final TextView textview = findViewById(R.id.textview);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textview.setText(JNIUtils.sayHelloFromJNI());
            }
        });
    }
}    	
```

 

上面代碼中的JNIUtils.sayHelloFromeJNI()就是我們在與MainActivity相同的包中新建JNIUtils類後在裏面編寫的native方法。如下所示:

剛剛創建時我們上面的sayHelloFromJNI()方法顯示的是警告紅色。把鼠標放到上面,它會提示我們對應的JNI頭文件沒有查找到。那麼接下來我們要做的就是去生成與這個sayHelloFromJNI()方法所對應的頭文件。
    4.生成頭文件。快捷鍵alt + F12調出AS下的Terminal窗口,在Terminal命令行窗口中輸入如下幾條指令,回車:

前兩個是進入指定目錄下的,要生成Java類對應的頭文件我們就必須要用到javah這個命令(把jdk一定要配置好,否則會說指令無效)

huaweidun.com.nailmeter.jni.JNIUtils 就是我們在上面新建的JNIUtils的完整類名了,執行完這幾天指令後,刷新一下目錄我們就可以在main目錄下看到jni這個目錄,並且在它裏面生成了我們JNIUtils類所對應的頭文件。進入頭文件中,代碼是如下這個樣子:

5.頭文件生成以後,我們就需要編寫我們的C/C++代碼了。右鍵jni目錄---->new--->C/C++ Source File

輸入要新建的C/C++文件名稱JNIHello,這裏我們用C++來編寫,所以Type爲.cpp,如果你選擇用C來編寫,那麼Type選爲.c,點擊ok。這裏說一下,在我們進行NDK開發的時候,選擇用C還是C++,在編寫代碼的時候除了C和C++基本的語法不同外,還是有許多不同地方需要注意。我們後續會慢慢介紹。這裏先默認跟着我的步驟來。
 

JNIHello.cpp中的內容如下

切記,在寫方法前面記得加extern "C",因爲如果要在C++代碼調用c的函數,就得用extern "C",因爲FFmpeg是c語言的代碼,

而cpp文件是c++的,可能在運行時會出現找不到對應的native方法

圈中的地方是我們的JNIUtils的路徑,一定不要寫錯

6.上面的搞定以後,我們需要在app的build.gradle中的defaultConfig中加入如下代碼。它表示項目在編譯時生成的動態庫的名字。

最後呢

我們把加載動態庫的代碼放到靜態代碼塊中,就是表示在JNIUtils這個類在加載的時候就去加載我們的動態庫

 

然後在app的根目錄下創建CMakeLists.txt

這裏要跟JNIUtils裏面加載的庫名要一致否則會加載不出來

還有一個錯誤是

這是因爲項目的jni需要引用一下,在build.gradle下面添加

以前出現類似錯誤的時候,我們的解決方案一般都是在gradle.properties中添加一行這樣的代碼:android.useDeprecatedNdk=true就搞定了。但是AS換爲3.0後你可以再試一下這種方案,肯定是不行的,它會提示你“Flag android.useDeprecatedNdk is no longer supported and will be removed in the next version of Android Studio.  Please switch to a supported build system.”大體意思就是最新的AS已經不支持useDeprecatedNdk這個標記了,並且在後續版本的AS中,它將被移除。所以我們新的解決方案就是按照它的提示在gradle.properties中添家android.deprecatedNdkCompileLease=1515317190556這行代碼。
 

最後點擊一下,調用,就可以看到

調用成功了

可以在app-build-intermediates-cmake-debug-obj看到我們的動態so庫

記得勾上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章