使用android studio做ndk开发相对于eclipse无疑要简单很多,那么下面我将做详细的步骤介绍:
1、下载ndk (最好使用最新版本的ndk ,我现在使用的ndk版本是android-ndk-r11c,studio版本是2.1.1)
2、新建项目
3、设置ndk路径
4、新建一个moudle 选择android library 命名为hellojni (下一遍文章将会说明在library中生成so文件的好处)
5、在lirbrary中新建一个类JniUtil
代码如下:
package com.example.user.hellojni; /** * Created by user on 2016/5/18. */ public class JniUtil { public JniUtil(){ } //该方法为java调用c/c++的接口 public static native String hello(); }
6、然后菜单栏Build-》make module hellojin build后可以看到hellojni\build\intermediates\classes\debug\com\example\user\hellojni\JniUtil.class 这里的class文件时我们想要的
然后打开Terminal命令窗口
7、windows下通过cd命令进入到上述debug目录下 执行以下命令:
javah -jni xxx.xxx.xxx.JniUtil (其中xxx代表你的包名) ,然后我们看到在debug目录下生产了一个
com_example_user_hellojni_JniUtil.h的头文件
8、然后在hellojni library的src->main目录下创建目录jni,并将上述的.h头文件剪切到jni目录下
9、再在jni目录下新建一个c文件或者cpp文件
代码如下:
// // Created by user on 2016/5/18. // #include "com_example_user_hellojni_JniUtil.h" //这里引入我们刚才的.h头文件 /* Class: com_example_user_hellojni_JniUtil * Method: hello * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_user_hellojni_JniUtil_hello (JNIEnv *env, jobject obj){ return (*env)->NewStringUTF(env,"这里是来自c的string"); }10、在我们的library hellojni的build.gradle中的defaultConfig添加如下代码:
ndk { moduleName "HelloJni" //生成的so名字,这个可以随意取名 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,目前可有可无。 }添加后build.gradle结构如下:
11、菜单栏Build-》Make Moduel hellojni,但这时候一般会报如下错误(不报错误那么我恭喜你):
这时候我们按照做就行,点击错误,studio会帮我们自动在工程gradle.properties文件中自动添加:
android.useDeprecatedNdk=true;如果没有自动添加,那么只需要我们在文件末尾手动添加即可,如下:
这时候我们再次build之后就不会再报错误,并且在我们的hellojni/build/intermediates目录下生成了一个ndk目录,我们点击ndk目录去看下下面有些什么东西呢
如图:
哈哈,我们发现在我们的ndk已经生成了我们需要的so文件,并且这个文件名和文件结构就是我们在hellojni的build.gradle中设置的
ndk { moduleName "HelloJni" //生成的so名字,这个可以随意取名 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,目前可有可无。 }12、这个时候我们再回到我们的JniUtil类中添加如下代码:
static{ System.loadLibrary("HelloJni");//注意这个名字是我们在build.gradle中ndk中配置的moduleName }添加完成后JniUtil代码如图所示:
13、再次build moduel后将我们的hellojni设置为主moduel的依赖:
14、在我们主moduel app的MainActivity中添加如下代码:
再次build工程之后,运行结果如下:
这个时候我们很兴奋,成功了,但是这个时候不要高兴的太早:
我们回到我们的library hellojni中,我们尝试我们的jni目录删除,然后在main目录下新建jniLibs目录,将我们的so文件拷贝到jniLibs目录中,如下图:
这是我们再次build工程之后运行结果如下:
我们发现程序仍然正常运行,但是我们的这种方式,就和我们引入第三方sdk的so文件一致了
下篇我们将继续讲到,如何在其他工程中使用我们制作的so文件!
最后,这里有一个关于jni和ndk写得比较好的博客:http://blog.csdn.net/zxw136511485/article/details/53304258