内容简介:安卓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节点,如图:
其中moduleName是最终生成的.so文件的名称,和前面System.loadLibrary(“ndk”)中保持一致,abiFilters用来说明生成哪些硬件架构的so,这里只是简单的包括x86和armeabi-v7a,关于对不同硬件架构的so的支持,大家可以参看 http://kvh.io/cn/android-ndk-so.html , ndk中的具体信息需要根据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目录下生成,如图:
所以我们需要切换到debug目录下,定位到debug目录下之后,输入命令:javah com.htq.baidu.ndk.NDKTest,即javah 包名+类名(其中类为定义了JNI函数的类),然后可以看到在debug目录下,为我们自动生成了JNI的.h文件,如图:
然后我们在整个工程上右键New->Folder->JNI Folder创建一个jni文件,位置默认即可,然后可以看到在main文件夹下产生了一个jni文件,然后我们把前面生成的jni的.h文件复制到该文件夹下,然后在该文件夹下创建一个.cpp的C++文件用来实现该头文件中的函数体,注意cpp文件名与头文件保持一致,在实现函数体的时候建议大家在书写函数名的时候直接从.h文件中复制过去,而不要手动输入,不然很容易出错的。此时工程主要结构如下:
其中.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的路径,如图:
然后运行程序,可以看到界面显示hello.this is from native code,这句话正是我们在本地.cpp文件中返回的字符串,说明jni调用成功。如图:
然后我们依此打开app/build/intermediates/ndk/debug/lib目录可以看到自动生成了”x86″和”armeabi-v7a”两种架构的so文件,这两种架构就是前面在ndk节点的abiFilters中配置的信息,其中so的名称为libndk.so,即lib+前面在ndk节点的moduleName的信息+.so。如图:
然后我们用解压缩软件打开apk文件可以看到上面两种架构的so文件已经被打包到apk中了,这样使用android studio进行ndk开发的步骤就完成了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架
- Java开发人员的Flex开发
- Java开发人员的Flex开发
- 行为驱动开发让开发做正确事
- 让开发者专注于应用开发,OpenCenter 3.0 开发者预览版发布
- 让开发者专注于应用开发,OpenCenter 3.0 开发者预览版发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Game Programming Patterns
Robert Nystrom / Genever Benning / 2014-11-2 / USD 39.95
The biggest challenge facing many game programmers is completing their game. Most game projects fizzle out, overwhelmed by the complexity of their own code. Game Programming Patterns tackles that exac......一起来看看 《Game Programming Patterns》 这本书的介绍吧!