Android studio NDK开发 从入门到实践一

写这篇文章,主要是为了给jni开发的新手指明一条道路. 不需要像我一样,走很多的歪路.

对于新手来说,网络找资源很重要,可是真正有用的资源确是很少,很多都是copy来copy去. 真正有用的很少.

公司直接丢给我一个c文件夹,让我开发android版的sdk.我是焦头烂额,搜资料,看视频,发帖子,什么都用了,也只是找到一些Helloworld级别的Demo.真正用到项目的东西,确是很少.

我也是踩过太多坑,所以希望大家在jni开发的时候能有在实战中的可借鉴的人.

我写博客很少搞这些虚的,都是直接上代码的.这次之所以这样,还是因为被jni支配的恐惧.

下面我们一步步开发吧.

1.从helloworld 开始

我之所以说从helloworld开始,因为jni开发,所以的配置,可以说helloworld最合适.也最简单易解.

首先我说说ndk开发需要的工具,我这里选择的版本如下. 


android studio :2.0 preview 4
SDK :android-sdk_r24.4.1-windows
NDK :android-ndk-r10e
gradle : gradle-2.10-all
jdk :1.7
为什么要这么选呢? 其实ndk 和sdk 会有匹配的问题, 版本相差太多,不匹配的话,会报错,我也是踩过这巨坑的,什么错呢?


FATAL EXCEPTION: main Process: com.viking.xxx, PID: 6145   java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aeabi_memclr4"
referenced by "/data/app/com.viking.jninetndk1-1/lib/arm/libjniLib.so "... 
没有这"__aeabi_memclr4"符号,找遍所有网上资料,只发现"__aeabi_memclr8"的.搞了半天,都想砸电脑了,才在Google上看到是版本不对导致的. 于是我直接重新在网上找了一个匹配的版本,才没有报这错.  心累.

1.把android studio sdk ndk jdk安装好,

Android studio NDK开发 从入门到实践一

我这里的版本可能跟我写的不一样,是因为这是我在家用的版本,所以会不一样. 你只需指向你自己的安装的工具就行了. 具体怎么安装,网上一大把.

当我是一样吧.

2.然后环境变量配置.

这种网上有的,我就直接上图:

ANDROID_HOME:C:\androidsdk

Android studio NDK开发 从入门到实践一

classpath: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

Android studio NDK开发 从入门到实践一

JAVA_HOME:C:\JDK

Android studio NDK开发 从入门到实践一

NDK_ROOT:C:\NDK\android-ndk-r15c;

Android studio NDK开发 从入门到实践一

Path: ;%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%NDK_ROOT%;

Android studio NDK开发 从入门到实践一

这图片上传真麻烦.

算了,不讲这些太基础的东西了.

开始我们的jni开发吧.

一步一步走:

1.创建本地方法.

Android studio NDK开发 从入门到实践一

讲解:

这个类中的helloWorld(string )是用来调用c代码中的方法. 这是一个无返回值有参数的本地方法.

2. 有了本地方法

我们需要创建jni调用本地方法的.h文件. android studio可以通过javah 自动生成.

首先我们make project 下 项目,会在如下图中位置看到jnimethod.class文件了.

Android studio NDK开发 从入门到实践一

2.通过Android studio Terminal工具,来生成jni文件java

<1.cd 到我们工程的main目录下 如下图所示

Android studio NDK开发 从入门到实践一

<2.通过javah 生成jni文件夹和头文件. 如何jni文件夹已经存在,可能不会生成.h文件

javah -d jni -classpath 自己的sdk\android.jar;..\..\build\intermediates\classes\debug com.包名.类名

如下图所示

Android studio NDK开发 从入门到实践一

如果生成了jni文件夹和.h文件.如下图则表示成功

Android studio NDK开发 从入门到实践一

3.创建cpp文件如图

Android studio NDK开发 从入门到实践一


c文件,名字可以随便取

Android studio NDK开发 从入门到实践一


4.编辑c文件了

我是直接将上面生成的.h文件复制过来,然后删除其他的,只留下了如下.

#include <jni.h>
JNIEXPORT void JNICALL Java_com_vikings_jnidemo_JniMethod_helloWorld
(JNIEnv *env, jobject jobj, jstring jst){
    //env 是jni函数指针,后面会告诉大家怎么用.
    //jobj 就是我们JniMehod的Java类的对象
    //jst 就是我们JniMethodJava类的helloWorld方法的参数
    //下面这个函数的意思就是把jstring,也就是jni能够识别的string字符串,转换成c能够识别char*
    const char * js = env->GetStringUTFChars(jst,0); //这里是.cpp文件,所以不需要env做参数
    //const char * js1 = env->GetStringUTFChars(env,jst,0); //如果是.c文件,需要中这个jni方法
}

Android studio NDK开发 从入门到实践一

至于cpp中的方法怎么写,我会在下节重点讲解(重点,也是jni项目开发的实际应用).

5.编辑完c文件.我们还有几点要去注意下了.

<1.local.properties文件是否有sdk 和ndk路径位置

Android studio NDK开发 从入门到实践一

<2.build.greld中添加


ndk{
    moduleName "jnilib" //生成so库的名字,在使用加载so库时,用到.    System.loadLibrary("jnilib");
    ldLibs "log"  //c中打应log时用到,后面会讲到,怎么打log
    abiFilters "armeabi", "armeabi-v7a", "x86" //生成的so库,需要在什么平台上运行
}

Android studio NDK开发 从入门到实践一


<3gradle.properties文件中 添加一句 android.useDeprecatedNdk = true.

Android studio NDK开发 从入门到实践一


6.rebuild下,在下面位置发现生成so库.就说明你已经成功生成so库拉

Android studio NDK开发 从入门到实践一

7.最后一步,就是使用了.

Android studio NDK开发 从入门到实践一

下节开始讲:jni在项目中具体的使用.

马勒格蛋蛋,博客真难写.谢谢大家,点个赞啥的.