Android studio NDK开发 从入门到实践一
写这篇文章,主要是为了给jni开发的新手指明一条道路. 不需要像我一样,走很多的歪路.
对于新手来说,网络找资源很重要,可是真正有用的资源确是很少,很多都是copy来copy去. 真正有用的很少.
公司直接丢给我一个c文件夹,让我开发android版的sdk.我是焦头烂额,搜资料,看视频,发帖子,什么都用了,也只是找到一些Helloworld级别的Demo.真正用到项目的东西,确是很少.
我也是踩过太多坑,所以希望大家在jni开发的时候能有在实战中的可借鉴的人.
我写博客很少搞这些虚的,都是直接上代码的.这次之所以这样,还是因为被jni支配的恐惧.
下面我们一步步开发吧.
1.从helloworld 开始
我之所以说从helloworld开始,因为jni开发,所以的配置,可以说helloworld最合适.也最简单易解.
首先我说说ndk开发需要的工具,我这里选择的版本如下.
1.把android studio sdk ndk jdk安装好,
我这里的版本可能跟我写的不一样,是因为这是我在家用的版本,所以会不一样. 你只需指向你自己的安装的工具就行了. 具体怎么安装,网上一大把.
当我是一样吧.
2.然后环境变量配置.
这种网上有的,我就直接上图:
ANDROID_HOME:C:\androidsdk
classpath: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
JAVA_HOME:C:\JDK
NDK_ROOT:C:\NDK\android-ndk-r15c;
Path: ;%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%NDK_ROOT%;
这图片上传真麻烦.
算了,不讲这些太基础的东西了.
开始我们的jni开发吧.
一步一步走:
1.创建本地方法.
讲解:
这个类中的helloWorld(string )是用来调用c代码中的方法. 这是一个无返回值有参数的本地方法.
2. 有了本地方法
我们需要创建jni调用本地方法的.h文件. android studio可以通过javah 自动生成.
首先我们make project 下 项目,会在如下图中位置看到jnimethod.class文件了.
2.通过Android studio Terminal工具,来生成jni文件java
<1.cd 到我们工程的main目录下 如下图所示
<2.通过javah 生成jni文件夹和头文件. 如何jni文件夹已经存在,可能不会生成.h文件
javah -d jni -classpath 自己的sdk\android.jar;..\..\build\intermediates\classes\debug com.包名.类名
如下图所示
如果生成了jni文件夹和.h文件.如下图则表示成功
3.创建cpp文件如图
c文件,名字可以随便取
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方法 }
至于cpp中的方法怎么写,我会在下节重点讲解(重点,也是jni项目开发的实际应用).
5.编辑完c文件.我们还有几点要去注意下了.
<1.local.properties文件是否有sdk 和ndk路径位置
<2.build.greld中添加
ndk{ moduleName "jnilib" //生成so库的名字,在使用加载so库时,用到. System.loadLibrary("jnilib"); ldLibs "log" //c中打应log时用到,后面会讲到,怎么打log abiFilters "armeabi", "armeabi-v7a", "x86" //生成的so库,需要在什么平台上运行 }
<3gradle.properties文件中 添加一句 android.useDeprecatedNdk = true.
6.rebuild下,在下面位置发现生成so库.就说明你已经成功生成so库拉
7.最后一步,就是使用了.
下节开始讲:jni在项目中具体的使用.
马勒格蛋蛋,博客真难写.谢谢大家,点个赞啥的.