由于要进行ffmpeg音视频推流等功能的实现,需要用到jni开发,那么就要进行ndk集成,结果使用eclipse的方式步骤是完成行不通的,用了几个小时研究as集成ndk的开发,搞定。废话不多说,开始干货
开发环境:android studio(2.0正式版) ndk(12) SDK版本(21)。
步骤1:安装ndk,由于as强大的内置,直接在SDK MANAGER->SDK Tools 里面点击NDK下载
下载后查看local.properties,如下图
到此NDK的安装完成。
步骤2:创建工程project,创建module,在activity中编写代码,先声明本地方法和load本地库,这里不上图,直接拷代码了
public class MainActivity extends AppCompatActivity {
private TextView textview;
static {
System.loadLibrary("worinimeimei");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.tv);
textview.setText(getStringFromC());
}
public native String getStringFromC();
}
这里注意一下,有的说v7包里的appcompatactivity会出问题,不过我的办法直接无视,全都有效。
步骤3:build-》make project,为了生成classes文件,其实用来生成.h文件的。这步我没空弄了,大家可以尝试一下,应该不需要这步。
然后成功build后应该是下图的样子:
步骤4:点击上图的Terminal,默认是进入当前的module目录,那么进入到java文件夹,即module/src/main/java。然后执行 javah 报名+类名 回车。我的是 javah com.xiaowu.nan.MainActivity 生效后再java下面会有com_xiaowu_nan_MainActivity.h文件。然后在main目录下创建jni类型的folder,如下图
将步骤4生成的.h文件拷贝到jni目录下,并对.h方法进行修改,要实现的功能,目录如图
jni里面的.h代码和生成的.h代码一样,但是需要改本地方法,那个你需要什么功能就自己写就好,我的如代码,然后在jni目录下创建一个.c文件,代码就是你刚才写的那些。如:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_xiaowu_nan_MainActivity */
#ifndef _Included_com_xiaowu_nan_MainActivity
#define _Included_com_xiaowu_nan_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_com_xiaowu_nan_MainActivity
* Method: getStringFromC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_com_xiaowu_nan_MainActivity_getStringFromC
(JNIEnv *env, jobject job){
return (*env)->NewStringUTF(env,"我擦最后一次了");
}
#ifdef __cplusplus
}
#endif
#endif
到这里,本地代码已经实现,如果此时代码出现下图的提示
不要担心,直接在gradle》properties中添加这行代码
android.useDeprecatedNdk=true
步骤5;在app中的build.gradle中defaultConfig中配置NDK 如我的
android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.xiaowu.nan" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk{ moduleName "worinimeimei" //这是c文件名称,activity里面要静态调用的 abiFilters "armeabi","armeabi-v7a","x86"//这是配置适用的手机硬件系统 } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets { main { jni.srcDirs = ['src/main/jni', 'src/main/jni/'] } } }然后build->makeproject 此时查看build/intermediates/下面是否生成了对应的ndk,有的话是否和我一样 如下图
如果一样,那就代表你彻底成功的完成了调用本地方法的流程,之后的就你自己来吧,慢慢玩吧。
纯手打,转载请注明。感谢尊重原创