程序员人生 网站导航

Android Studio2.2 配置NDK

栏目:综合技术时间:2016-09-03 15:55:13

Android Studio2.2 配置NDK

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

环境

  • 主机:WIN10
  • 开发环境:Android Studio2.2 Preview 3

步骤

  • 安装NDK
    打开Tools->Android->SDK Manager->SDK Tools选中LLDB和NDK,点击确认,软件会自动安装NDK。
  • 配置环境变量

    • 增加1项:NDK_ROOT,如:C:\soft\adt-bundle-windows-x86⑵0130911\sdk\ndk-bundle
    • 在path中增加%NDK_ROOT%
  • 在main中新建文件夹jni

  • 新建hello-jni.c
    函数需依照规则命名:Java_包名类名方法名
/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include <string.h> #include <jni.h> /* This is a trivial JNI example where we use a native method * to return a new VM String. See the corresponding Java source * file located at: * * apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java */ //jstring //Java_com_bazhangkeji_MainActivity_stringFromJNI( JNIEnv* env, // jobject thiz ) //{ // return (*env)->NewStringUTF(env, "Hello from JNI !"); //} JNIEXPORT jstring JNICALL Java_com_bazhangkeji_demo01_MainActivity_stringFromJNI(JNIEnv *env, jobject instance) { // // TODO // // // return (*env)->NewStringUTF(env, returnValue); return (*env)->NewStringUTF(env, "Hello from JNI !"); }
  • 新建Android.mk
# Copyright (C) 2009 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE⑵.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
  • 在build.gradle中配置
    配置好,make project便可生成.so文件在app\build\intermediates\ndk-build\debug\lib中。
    增加语句:
externalNativeBuild { ndkBuild { path file("src\\main\\jni\\Android.mk") } }

完全的代码:

apply plugin: 'com.android.application' android { compileSdkVersion 24 buildToolsVersion "24.0.0" defaultConfig { applicationId "com.bazhangkeji.demo01" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // ndk { // moduleName "libspeex" // cFlags "-std=c++11 -fexceptions" // ldLibs "log" // stl "gnustl_shared" // abiFilter "armeabi-v7a" // } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { ndkBuild { path file("src\\main\\jni\\Android.mk") } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:24.0.0' compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha3' compile 'com.android.support:design:24.0.0' testCompile 'junit:junit:4.12' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' androidTestCompile 'com.android.support.test:runner:0.5' androidTestCompile 'com.androd.support:support-annotations:24.0.0' }
  • 在java层调用
public class MainActivity extends AppCompatActivity { private static final int RECORDER_SAMPLERATE = 8000; private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO; private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; private AudioRecord recorder = null; private Thread recordingThread = null; private boolean isRecording = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); setButtonHandlers(); enableButtons(false); int bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING); System.out.println(stringFromJNI()); } public native String stringFromJNI(); public native String unimplementedStringFromJNI(); static { System.loadLibrary("hello-jni"); }
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐