編輯:關於Android編程
從Android Studio 1.3 Beta1開始,就支持了NDK。不過使用的是一個全新的實驗性的gradle構建工具。官方地址http://tools.android.com/tech-docs/new-build-system/gradle-experimental,英文好的可以直接看原文。
在進行配置前請先將Android Studio更新至最新版本,目前最新版本是1.4 Bata4
並且使用Android Studio內置的SDK管理器下載NDK。
或者在項目上右鍵打開Project Structure,切到的SDK Location頁進行安裝
注意這個NDK安裝好後其目錄在SDK目錄下的ndk-bundle目錄下,與以往的不同。
要修改的文件見下圖
首先需要將根目錄下的gradle修改為實驗性的gradle
classpath 'com.android.tools.build:gradle-experimental:0.2.0'
最終是這樣的
並且需要gradle 2.5的支持,將gradle/gradle-wrapper.properties中的版本修改為2.5<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">
distributionUrl=https://services.gradle.org/distributions/gradle-2.5-all.zip
最終是這樣的
然後修改原來的app/build.gradle,注意現在各項配置都是有等號的,並且使用的是com.android.model.application而不再是原來的com.android.application,如果是Library,則是com.android.model.library。然後android外圍包了一層model。原來在android裡面的buildTypes 移到了外面。等等,看下面內容,注意變化。
apply plugin: 'com.android.model.application'
model{
android {
compileSdkVersion = 22
buildToolsVersion = 23.0.1
defaultConfig.with {
applicationId = com.kltz88.car.jnidemo
minSdkVersion.apiLevel = 14
targetSdkVersion.apiLevel = 22
versionCode = 1
versionName = 1.0
}
tasks.withType(JavaCompile) {
//指定編譯JDK版本
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
}
android.ndk {
moduleName = test
ldLibs +=log
abiFilters +=armeabi
abiFilters +=armeabi-v7a
abiFilters +=x86
}
android.buildTypes {
release {
minifyEnabled = false
proguardFiles += file( 'proguard-rules.pro')
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
}
在android.ndk中進行ndk的配置,模塊名字是必須的。然後使用了log,並且支持armeabi,armeabi-v7a,x86三個平台。
然後增加jni目錄,在main上右鍵新建jni目錄
在彈出的窗口中你可以修改jni目錄,默認是在main/jni中
新建一個Test的類,加載jni庫,聲明native方法
public class Test {
static {
System.loadLibrary(test);
}
public native void test();
}
這時候你會發現test方法是紅色的
在上面按alt+enter生成c層的方法
修改為下方的代碼
#include
#include android/log.h
JNIEXPORT void JNICALL
Java_com_kltz88_car_jnidemo_Test_test(JNIEnv *env, jobject instance) {
__android_log_write(ANDROID_LOG_ERROR,TAG,TEST);
}
如果你需要生成頭文件,使用命令行即可
之後會在jni目錄生成對應的頭文件
然後在java層調用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Test t=new Test();
t.test();
}
}
便會看到日志的輸出。
注意如果沒有在gradle中指定java的對應版本,運行時可能會報錯
tasks.withType(JavaCompile) {
//指定編譯JDK版本
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
}
錯誤信息如下,遇到該錯誤加上上面的代碼即可
最後就是調試的問題了,理論上來說應該是支持調試的,但是我在windows上並沒有試驗成功。下面貼出步驟。
增加native運行方法
修改為
然後下斷點,理論上是能調試的,但是我遇到了下面的問題,導致無法繼續,也查過了,查不出問題所在,就這樣吧,改天在linux下試試是不是正常。
你會發現整個流程下來,原來的Android.mk和Application.mk都不再需要了,所有配置在gradle中配置即可。
各種的Span就是通過SpannableString來封裝樣式的,設置完Span之後需要將Span放入到SpannableString類中,然後SpannableStri
本文實例為大家分享了視頻播放器的兩種方式,供大家參考,具體內容如下1)、SurfaceView在布局文件中<?xml version=1.0 encodin
一、為什麼要加入混淆機制? 為了防止apk被反編譯後,很容易被其他人看懂。 混淆機制的本質是什麼? 把原來有具體含義的類名
1如圖,當我們的項目有很多子項標題的時候.需要對標題實現左右滑動.點擊標題切換Fragment.當滑動最左邊的時候左箭頭消失,滑至右邊的時候同理.右箭頭消