安卓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开发的步骤就完成了。


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

查看所有标签

猜你喜欢:

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

深入理解LINUX网络技术内幕

深入理解LINUX网络技术内幕

Christian Benvenuti / 夏安、闫江毓、黄景昌 / 中国电力出版社 / 2009-6 / 128.00元

Linux如此的流行正是得益于它的特性丰富及有效的网络协议栈。如果你曾经惊叹于Linux能够实现如此复杂的工作,或者你只是想通过现实中的例子学习现代网络,《深入理解Linux网络内幕》将会给你指导。同其他O'Reilly的流行书籍一样,《深入理解Linux网络内幕》清楚地阐述了网络的基本概念,并指导你如何用C语言实现。虽然早先的 TCP/IP经验是有用的,但初学者通过《深入理解Linux网络内幕》......一起来看看 《深入理解LINUX网络技术内幕》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器