AndroidStudio NDK開發

以前一直用Eclipse做Android開發,後來谷歌宣佈停止ADT的更新了,無奈轉向使用AndroidStudio這個IDE了。

Android NDK開發 :使java能夠調用C/C++寫的SO庫,其實就是Java的jni技術

好處:APK破解難度增大,把核心業務邏輯寫到so庫裏,會增加破解的門檻。

先說下我的環境

Windows 7 SP1 64位

JDK版本  java version "1.7.0_80"

AndroidStudio 1.5.1


1.新建一個Android工程


2.配置NDK

打開ProjectStructure窗口->點擊SDK Location,下面的Android NDK Location 點擊下載安裝NDK


3.新建類NetUtil(類名可以自己隨便寫了),



4.編寫類NetUtil內容

package demo.xgn.com.app1;

/**
 * Created by Administrator on 2016/7/26.
 */
public class NetUtil {
    static {
        System.loadLibrary("NetUtil"); //這裏的NetUtil是底層So庫的名稱
    }
    public native String getNetResult(); //熟悉java的jni編程的同學,一看就知道了,這是本地方法,對應so庫裏的方法
}
編譯項目Build->Make Module 'app'

查看intermediates\classes\debug 目錄下是否生成NetUtil.class文件,若沒有生成則重新編譯


打開AndroidStudio的Termminal命令行窗口

cd C:\Users\Administrator\AndroidStudioProjects\app1\app\build\intermediates\classes\debug (這個路徑取自己電腦上的實際路徑)

執行 javah -jni demo.xgn.com.app1.NetUtil 生成頭文件

會在該目錄生成對應的頭文件,把該文件拷貝到 main/jni目錄下(如果jni目錄不存在則手動新建)


接着在jni目錄下新建 nettest.c文件(文件名隨便寫)

//
// Created by Administrator on 2016/7/26.
//

#include "demo_xgn_com_app1_NetUtil.h"

JNIEXPORT jstring JNICALL Java_demo_xgn_com_app1_NetUtil_getNetResult
        (JNIEnv *env, jobject obj){
    return (*env)->NewStringUTF(env,"Android NDK編程");
}

編輯 local.properties 文件添加 NDK路徑(AndroidStudio會在安裝NDK後自動添加的)

ndk.dir=C\:\\Users\\Administrator\\AppData\\Local\\Android\\sdk\\ndk-bundle
編輯項目下的build.gradle
找到 defaultConfig 在它裏面添加

ndk {
    moduleName "NetUtil"          //生成的so名字(這個So庫名稱要與NetUtil中載入的庫名稱一致)
}
編譯並運行APK

在Activity中調用NetUtil

package demo.xgn.com.app1;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.logging.Handler;

public class MainActivity extends Activity {
    
    private Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        this.btn1=(Button)this.findViewById(R.id.btn1);
        if(btn1!=null){
            btn1.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    NetUtil nu=new NetUtil();
                    Toast.makeText(MainActivity.this,nu.getNetResult(),Toast.LENGTH_LONG).show();
                }
            });
        }


    }


}

.

編譯並運行APK





 

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