Android關於JNI開發(2)-----Android Studio工具開發

           關於jni的簡介,在我的上篇博客Android關於JNI開發(1)-----eclipse工具開發裏面已經介紹過了,這裏就不在多講,因爲上篇博客裏面開發工具用的是eclipse,而現在基本都已經開始用Android Studio了,所以這裏在介紹一下用Android Studio開發jni.網上有很多將步驟的,然而靠譜的不是很多。這裏給大家提供一個流程。然後在將一些常見的問題的處理方法。

       我這裏用的AS版本是2.0,ndk的版本是10r。最開始ndk版本是8r,各種問題,後來改成10r,就好了。

 1,創建一個android工程,JniDemo,並在MainActivity中添加一個本地方法:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv=(TextView)findViewById(R.id.tv);
    }
    public native String getString();
}
    如果你的本地方法報錯(是紅色的),可以不用管它,也可以settings->plugins->Android NDK Support後面的勾去掉就可以了。


2,   進入文件夾D:\Android\JniDemo\app\src\main\java然後按住shift鍵,點鼠標右鍵,然後選擇“在此處打開命令窗口”,然後進入doc命令的界面,      然後輸入命令javah com.example.gaolong.jnidemo.MainActivity如果沒有錯誤,則會在D:\Android\JniDemo\app\src\main\java下生成一個文件  com_example_gaolong_jnidemo_MainActivity.h,程序中在D:\Android\JniDemo\app\src\main\java\com\example\gaolong\jnidemo下出現          com_example_jnidemo_MainActivity.h文件。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_gaolong_jnidemo_MainActivity */

#ifndef _Included_com_example_gaolong_jnidemo_MainActivity
#define _Included_com_example_gaolong_jnidemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_gaolong_jnidemo_MainActivity
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_gaolong_jnidemo_MainActivity_getString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 3, 然後在D:\Android\JniDemo\app\src\main下創建一個文件夾,命名爲“jni”,將com_example_jnidemo_MainActivity.h複製到jni中,然後創建兩個c文件(一個寫自己的代碼,一個什麼都不寫,AS開發jni的時候有一個bug,就是如果jni中只有一個c文件,編譯的時候會出錯。)jni.c和empty.c然後打開.h文件夾,將裏面的方法複製到jni.c文件夾中,然後補全參數和要實現的邏輯代碼。在.c中加入導入文件的代碼。

jni.c代碼內容如下:


#include<stdlib.h>
#include<stdio.h>
#include"com_example_gaolong_jnidemo_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_gaolong_jnidemo_MainActivity_getString
  (JNIEnv * env, jobject job){
  
   return (*env)->NewStringUTF(env,"I'm comes from to Native Function!");
  }


4,配置ndk.選中ndk的路徑,然後ok,接着,檢查local.properties文件,末尾是否增加了ndk路徑


ndk.dir=D\:\\BaiduYunDownload\\android-ndk32-r10-windows-x86\\android-ndk-r10
sdk.dir=D\:\\ruanjiananzhuangbao\\sdk

5.修改app下的build.gradle,在defaultConfig 中增加

defaultConfig {
        applicationId "com.example.gaolong.jnidemo"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "jni"  //你的so庫文件名
        }
    }


6在gradle.properties文件中,末尾增加代碼:

android.useDeprecatedNdk=true

7最後MainActivity.java中增加相應調用代碼,即調用c代碼中的方法。

public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("jni");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv=(TextView)findViewById(R.id.tv);
        tv.setText(getString());
    }
    public native String getString();
}


8然後直接run就可以了,運行成功。


我的源碼在這裏,有需要的朋友可以下載一下。源碼:源碼






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