Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld
1、Android NDK简介 NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持Java语言开发)。 简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java native interface)层开发,SDK开发可以称为上层开发。 2、为何要用NDK 2.1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。 2.2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。 2.3、C&C++的代码运行速度和效率都比java快很多。 3、NDK环境的搭建 在http://developer.android.com/sdk/ndk/index.html下载最新版的NDK,然后解压到你喜欢的位置,然后把NDK的所在的目录,配置到环境变量里面就行。 如我在windows下面用cygwin开发。配置环境变量可以参考http://blog.csdn.net/conowen/article/details/7518870 简单来说就是在Linux或者cygwin的安装目录,跳转到/home/YourName/,然后编辑.bash_profile文件,在末尾添加如下语句,具体根据自己的情况而定。 [java] view plain copy print?在CODE上查看代码片派生到我的代码片 ndk=/home/conowen/android-ndk-r7b export ndk 4、新建一个NDK工程 新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.c和Android.mk。 HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的) [java] view plain copy print?在CODE上查看代码片派生到我的代码片 #include <string.h> #include <jni.h> jstring Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !"); } /*注意,这里 jstring 表示返回值 Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI 写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。 包名:com_conowen_helloworld Activity名:HelloWorldActivity 方法名:helloWorldFromJNI JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。 */ Android.mk代码如下 关于Android.mk的编写格式,下一篇博文补全 [java] view plain copy print?在CODE上查看代码片派生到我的代码片 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写 LOCAL_MODULE := HelloWorld LOCAL_SRC_FILES := HelloWorld.c include $(BUILD_SHARED_LIBRARY) 然后在终端里面,转到HelloWorld目录下,执行 [java] view plain copy print?在CODE上查看代码片派生到我的代码片 $ndk/ndk-build $ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libs和obj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。 5、新建一个Android工程 在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。 [java] view plain copy print?在CODE上查看代码片派生到我的代码片 package com.conowen.helloworld; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText(helloWorldFromJNI()); setContentView(tv); } public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了 static { System.loadLibrary("HelloWorld");// 加载库,前面的lib和,后缀名不用写 } }
分类:
android提高篇
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2013-12-10 android程序复制数据库
2013-12-10 Android SQLiteDatabase的使用