Android NDK开发Hello Word!
在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力。这里我们选择使用C+JAVA开发Android程序,首先你必须了解C语言、JAVA语言以及Linux操作系统,这样可以帮助你开始上手,当然不是说你必须是大牛才能进行NDK开发,下面我们来一起实现一个简单的NDK程序。
第一步,创建Android工程
打开开发环境eclipse,在左侧空白区域,右键单击创建Android工程(非常简单,不再赘述)。
第二步,编译头文件
打开我们的主Activity,在里面定义一个native类型的方法:
public class MainActivity extends Activity { public static native String getStringFromC(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
创建好我们的Android工程后,并定义好方法之后,然后在目录下新建一个jni目录,之后点击运行输入cmd回车-->通过cd命令进入当前的工程目录
然后通过javah命令生成我们的头文件,下面先看一下javah命令吧:
这里我们主要使用到-d、-jni、 -classpath,下面我们来生成我们的头文件,在命令行输入:javah -classpath bin/classes -d jni com.edu.hpu.jni.MainActivity
遇到这个问题是因为我们的calsspath在编译时,没有找到Android.jar文件导致的,错误信息如下:
这个问题很好解决,第一种方式,我们在环境变量calsspath下添加一个Android.jar文件的目录即可,Android.jar文件存在于我们的Android SDK文件夹,platforms文件夹下存在很多Android版本,我们任意选一个打开,我们就找到了我们需要的Android.jar文件,然后将地址配置到环境变量classpath下即可;第二种方式我们在命令行设置一个路径即可:
这样我们的头文件就生成了,最下化我们的命令行窗口,因为随后我们还要使用,完成上面的操作,我们刷新一下工程,这是在jni目录下会对一个头文件:com_edu_hpu_jni_MainActivity.h(文件名因工程而异),下面我们在jni目录下新建一个.c文件:
#include <stdio.h>
#include <stdlib.h>
#include "com_edu_hpu_jni_MainActivity.h" JNIEXPORT jstring JNICALL Java_com_edu_hpu_jni_MainActivity_getStringFromC(JNIEnv* env, jclass this){
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Java_com_edu_hpu_jni_MainActivity_getStringFromC简单说一下这个名字,Java_是固定前缀,com_edu_hpu_jni_MainActivity:主activity包名+类名,getStringFromC:方法名
这里为了防止我们写错,我们打开刚刚生成的头文件,从里面拷贝出来:
到这里我们的任务即将完成,下面我们将之前demo工程的jni目录下的Android.mk拷贝到我们的工程jni目录下,然后双击打开:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE:指我们.c文件的访问标记;LOCAL_SRC_FILES:指我们在jni目录下新建的.c文件。
最后我们需要在我们的主Activity中进行调用.C类库:
public class MainActivity extends Activity { static{
System.loadLibrary("hello");
} public static native String getStringFromC();
private TextView text; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.hello);
text.setText(getStringFromC());
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
做完上面的工作,我们打开我们的命令行窗口,输入ndk-build编译生成.so类库
操作成功后,我们刷新一下工程,会发现obj目录下增加了一个.so文件:
然后我们点击运行工程,这样我们的第一个NDK程序就算完工了,最后附一张图:
上面提到的命令行方式生成.so文件是不是感觉很麻烦,接下来请和我一起探究一下如何使用编译工具eclipse完成上面的操作。
第一步:安装ndk
安装方式详见Android NDK开发初识
第二步:配置eclipse
首先我们需要将ndk环境配置到eclipse:点击 window-->perferences:
然后选择Android-->ndk-->将我们的ndk安装目录添加进来:
到这里我们的配置基本完成,最后给我们的工程配置一个启动ndk-build的路径,选择我们的工程右键单击选择properties:
好了,我们的eclipse编译ndk程序的配置就算大功告成,大家快去试一下吧,超级方便。
Android NDK开发Hello Word!的更多相关文章
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- Android NDK开发
Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...
- Android NDK 开发(四)java传递数据到C【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...
- Android NDK 开发(三)--常见错误锦集合Log的使用【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511 Android NDK开发经常因某些因素会出现一些意想不到的错误, ...
- Android NDK 开发(二) -- 从Hlello World学起【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41805719 上篇文章讲述了Android NDK开发的一些基本概念,以及NDK ...
- android NDK开发环境搭建
android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...
- !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
http://hujiaweibujidao.github.io/blog/2013/11/18/android-ndk-and-opencv-development-3/ Android Ndk a ...
- Android NDK开发及调用标准linux动态库.so文件
源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...
- Android NDK开发method GetStringUTFChars’could not be resolved
Android NDK开发method GetStringUTFChars'could not be resolved 图1 最近用到android的ndk,但在eclipse中提示method Ge ...
随机推荐
- Angular初步
一.angular.js是什么? angular.js是一个javascript的框架,与jquery是一个级别的,区别是jquery主要是擅长dom操作,而angular主要是擅长绑定数据显示数据. ...
- HDU2159 二维完全背包
FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- VS 默认开发环境如何更改
话不多说,直接上图
- '-[__NSCFString stringFromMD5]: unrecognized selector sent to instance 0x14d89a50'
类型:ios 问题描述: 导入百度地图 然后在模拟器运行可以,真机测试不行: 报错: '-[__NSCFString stringFromMD5]: unrecognized selector sen ...
- MVC学习-http://www.w3school.com.cn/
连接字符串: <add name="MovieDBContext" connectionString="Data Source=|DataDirectory|\Mo ...
- 关于bootstrap和响应式布局
bootstrap导入 首先需要安装好插件 然后就是在代码器写导入代码 代码如下 <html lang="zh-CN"> <head> <meta c ...
- SQLite 预写式日志
SQLite在3.7.0版本引入了WAL (Write-Ahead-Logging),WAL的全称是Write Ahead Logging,它是很多数据库中用于实现原子事务的一种机制,引入WAL机制之 ...
- 微软StockTrader应用程序
这是一个采用 .NET Enterprise Application Server 技术的端到端示例应用程序.应用程序代码可以从 这里 下载. 代码中演示了WCF服务和移动开发,包括用Xamarin ...
- [译]Kinect for Windows SDK开发入门(十八):Kinect Interaction交互控件
本文译自 http://dotneteers.net/blogs/vbandi/archive/2013/03/25/kinect-interactions-with-wpf-part-i-getti ...
- Apache Mina实战
Mina介绍 Mina可以用于快速的开发基于网络通信的应用,特别是在开发手机端的游戏应用时,使用的较为普遍.本文简单介绍了一个用Mina搭建的一个简易讨论组,通过该应用可以对Mina的基本用法用途有个 ...