安卓NDK开发

栏目: C++ · 发布时间: 7年前

内容简介:安卓NDK开发

下面以android studio为例讲解如何使用ndk进行jni开发。首先创建一个安卓项目,这里为了简单起见,整个Activity主界面只包括一个TextView,其内容从本地C++代码中的getString()函数获取的。

public class MainActivity extends AppCompatActivity {
 
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv= (TextView) findViewById(R.id.text);
        tv.setText(new NDKTest().getString());
    }
}

然后创建名为NDKTest的类,在该类中定义一个native函数getString(),使用System.loadLibrary(“ndk”);来加载so文件,其中so的名称可以随意,这里指定为”ndk”,代码如下:

public class NDKTest {
    public native String getString();
 
    static {
        System.loadLibrary("ndk");
    }
}

然后打开app的build.gradle文件,在android/defaultConfig下面添加ndk节点,如图:

安卓NDK开发

其中moduleName是最终生成的.so文件的名称,和前面System.loadLibrary(“ndk”)中保持一致,abiFilters用来说明生成哪些硬件架构的so,这里只是简单的包括x86和armeabi-v7a,关于对不同硬件架构的so的支持,大家可以参看 http://kvh.io/cn/android-ndk-so.htmlndk中的具体信息需要根据jni代码的使用情况来配置,上面只是一个简单的例子而已,但是一般都包含 moduleName和abiFilters信息。

ndk信息配置好之后,依此点击Android Studio菜单栏的Build->Make Project.然后点击Terminal按钮打开终端面板,可以看到当前目录定位到了我们的项目所在的目录,然后在终端中输入如下命令:cd app/build/intermediates/classes/debug将目录切换到项目的app/build/intermediates/classes/debug目录下,之所以切换到该目录下,是因为我们接下来需要要执行javah命令来生成NDKTest类中native函数的JNI头文件,而javah命令会根据包名所在的路径来查找对应的.class文件,而当我们执行Build->Make Project之后,生成的.class文件会在app/build/intermediates/classes/debug目录下生成,如图:

安卓NDK开发

所以我们需要切换到debug目录下,定位到debug目录下之后,输入命令:javah com.htq.baidu.ndk.NDKTest,即javah 包名+类名(其中类为定义了JNI函数的类),然后可以看到在debug目录下,为我们自动生成了JNI的.h文件,如图:

安卓NDK开发

然后我们在整个工程上右键New->Folder->JNI Folder创建一个jni文件,位置默认即可,然后可以看到在main文件夹下产生了一个jni文件,然后我们把前面生成的jni的.h文件复制到该文件夹下,然后在该文件夹下创建一个.cpp的C++文件用来实现该头文件中的函数体,注意cpp文件名与头文件保持一致,在实现函数体的时候建议大家在书写函数名的时候直接从.h文件中复制过去,而不要手动输入,不然很容易出错的。此时工程主要结构如下:

安卓NDK开发

其中.cpp中代码如下:

#include <jni.h>
#include "com_htq_baidu_ndk_NDKTest.h"
 jstring JNICALL Java_com_htq_baidu_ndk_NDKTest_getString
        (JNIEnv * env, jobject object){
        return env->NewStringUTF("hello.this is from native code");
}

如果.cpp中jni.h出现红色,提示cannot find jni.h可能是ndk没配置,需要在File->Project Structure中选择你安装的ndk的路径,如图:

安卓NDK开发

然后运行程序,可以看到界面显示hello.this is from native code,这句话正是我们在本地.cpp文件中返回的字符串,说明jni调用成功。如图:

安卓NDK开发

然后我们依此打开app/build/intermediates/ndk/debug/lib目录可以看到自动生成了”x86″和”armeabi-v7a”两种架构的so文件,这两种架构就是前面在ndk节点的abiFilters中配置的信息,其中so的名称为libndk.so,即lib+前面在ndk节点的moduleName的信息+.so。如图:

安卓NDK开发

然后我们用解压缩软件打开apk文件可以看到上面两种架构的so文件已经被打包到apk中了,这样使用android studio进行ndk开发的步骤就完成了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深度学习框架PyTorch:入门与实践

深度学习框架PyTorch:入门与实践

陈云 / 电子工业出版社 / 2018-1 / 65

《深度学习框架PyTorch:入门与实践》从多维数组Tensor开始,循序渐进地带领读者了解PyTorch各方面的基础知识。结合基础知识和前沿研究,带领读者从零开始完成几个经典有趣的深度学习小项目,包括GAN生成动漫头像、AI滤镜、AI写诗等。《深度学习框架PyTorch:入门与实践》没有简单机械地介绍各个函数接口的使用,而是尝试分门别类、循序渐进地向读者介绍PyTorch的知识,希望读者对PyT......一起来看看 《深度学习框架PyTorch:入门与实践》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具