以前一直用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