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

使用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

使用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

猜你喜欢

转载自blog.csdn.net/u010693827/article/details/80111924