您的位置:首页 > 移动开发 > Android开发

android studio之jni(上)生成so文件

2016-05-19 09:50 393 查看
使用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文件!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: