- 浏览: 898093 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
天天来注册:
...
try catch finally 用法 -
tadpole_java:
谢谢你的分享。
二十七、Qt数据库(七)QSqlRelationalTableModel(转) -
359449749tan:
android之EditText文本监听(addTextChangedListener) -
michael_wang:
人过留名 多谢分享
Android NOtification 使用 -
wilsonchen:
wangqi0614 写道这个删除是删除所有的把?能不能值删除 ...
Android的SharedPreferences保存与删除数据简单实例
前言
Android系统中的应用程序都是用Java开发的。Android NDK使我们能够在android上使用C/C++开发的原生代码。有两个理由使用NDK: 一是合理的重用现有的代码;二是在程序中某些关键的部分提高执行效率。
这里先讲几个符号的约定:
<project> - 你的Android应用程序工程的目录
<ndk> - 你的ndk安装的目录
捷径
这里先扯一句题外话 -- 如果你不需要使用NDK开发,只是需要使用第三方用NDK开发的库,那么你只需要这样做:
把第三方提供的libxxx.so放到你的<project>/libs/armeabi/下, 然后在程序随便什么地方中加入
static {
System.loadLibray("xxx");
}
就可以使用该库了。
安装NDK
NDK的安装很简单:
1. 首先要将SDK升级至最新,然后下载ndk(可能要fanqiang,恩恩)将它解压到某个目录<ndk>下。
2. 运行: <ndk>/build/host-setup.sh
3. 如果成功的话就OK了,如果失败的话检查一下你是不是下载了正确的ndk版本(例如你的操作系统是linux而下载了windows版的ndk).
Java部分
现在我们用一个很简单的例子来说明NDK的使用。我们在eclipse中新建一个android工程,其中:
Project Name:jnitest
Build Target: Android 1.6
Application Name: JNI Test
Package Name: org.eshock.jnitest
Create Activity: JNITest
JNITest.java:
--------------------------------------------------------------------------------
package org.eshock.jnitest;
import android.app.Activity;
import android.os.Bundle;
public class JNITest extends Activity {
public native int plus (int x, int y);
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int x = plus(1, 2);
android.util.Log.d("jni", String.valueOf(x));
}
static {
System.loadLibrary("mylib");
}
}
--------------------------------------------------------------------------------
我们只是演示NDK,所以就不要界面了。在这个程序中,我们调用一个c语言编写的plus(int, int)函数来计算1+2的值,然后在log中打印它。这个库的名称叫做mylib。
要使用一个c语言的函数,需要在java中声明:
public native int plus(int x, int y);
这样java编译器就知道这个函数是外部库中实现的。
C部分
接下来我们使用C语言实现这个plus函数。
创建<project>/jni/mylib.c:
--------------------------------------------------------------------------------
#include <string.h>
#include <jni.h>
JNIEXPORT jint JNICALL
Java_org_eshock_jnitest_JNITest_plus( JNIEnv* env,
jobject thiz,
jint x,
jint y )
{
return x + y;
}
--------------------------------------------------------------------------------
这里我们看到,mylib.c里的plus函数比java里面的plus函数的签名要复杂了很多,主要是plus前面增加了包名,函数中多了两个参数,以及所有的int变成了jint。关于c中类型与jni中类型的对应关系,可以参见jni的相关文档,例如core Java II中的最后一章。如果你不想去查阅文档,有一个方法:
首先随便在某个目录下创建一个文件JNITest.java:
--------------------------------------------------------------------------------
public class JNITest {
public native int plus (int x, int y);
}
--------------------------------------------------------------------------------
然后在命令行下执行:
javac JNITest.java && javah JNITest
将生成一个文件JNITest.h:
--------------------------------------------------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNITest */
#ifndef _Included_JNITest
#define _Included_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNITest
* Method: plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_JNITest_plus
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
--------------------------------------------------------------------------------
这里自动生成了java中native函数对应的签名,你可以在c代码中使用它。(记得修改包名)。
Android.mk和Application.mk
Android.mk是一个makefile,用来告诉NDK需要编译哪些文件,生成哪些模块。我们创建<jni>/Android.mk文件:
--------------------------------------------------------------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := mylib.c
include $(BUILD_SHARED_LIBRARY)
--------------------------------------------------------------------------------
其中LOCAL_PATH表示c源代码文件的位置;LOCAL_MODULE表示生成的共享库的名称;LOCAL_SRC_FILES代表c代码的文件。不需要把头文件列在里面;头文件的依赖关系是ndk自动计算的。
Application.mk的作用是告诉Android SDK需要哪些库文件。有了它,NDK就可以把库放在正确的位置。我们创建<project>/Application.mk:
--------------------------------------------------------------------------------
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := mylib
--------------------------------------------------------------------------------
APP_PROJECT_PATH代表android工程所在目录,在本例中它被放在<project>中; APP_MODULES表示工程需要的库,如果有多个以空格分开。
编译共享库
由于ndk规定Application.mk必须放在<ndk>/apps/project_name,我们在<ndk>下创建一个符号连接:
ln -s <project> <ndk>/apps/jnitest
这样,我们就可以开始编译共享库了:
在<ndk>目录下运行:
make APP=jnitest
--------------------------------------------------------------------------------
Android NDK: Building for application 'jnitest'
Compile thumb : mylib <= apps/jnitest/jni/mylib.c
SharedLibrary : libmylib.so
Install : libmylib.so => apps/jnitest/libs/armeabi
--------------------------------------------------------------------------------
可以看到编译成功,并在<project>/libs/armeabi/下生成了libmylib.so。
测试
在运行之前,首先确认一下你的工程里面各个文件都齐全,应该类似于这样:
然后测试,正常的话应该能看到log中有输出3.
Android系统中的应用程序都是用Java开发的。Android NDK使我们能够在android上使用C/C++开发的原生代码。有两个理由使用NDK: 一是合理的重用现有的代码;二是在程序中某些关键的部分提高执行效率。
这里先讲几个符号的约定:
<project> - 你的Android应用程序工程的目录
<ndk> - 你的ndk安装的目录
捷径
这里先扯一句题外话 -- 如果你不需要使用NDK开发,只是需要使用第三方用NDK开发的库,那么你只需要这样做:
把第三方提供的libxxx.so放到你的<project>/libs/armeabi/下, 然后在程序随便什么地方中加入
static {
System.loadLibray("xxx");
}
就可以使用该库了。
安装NDK
NDK的安装很简单:
1. 首先要将SDK升级至最新,然后下载ndk(可能要fanqiang,恩恩)将它解压到某个目录<ndk>下。
2. 运行: <ndk>/build/host-setup.sh
3. 如果成功的话就OK了,如果失败的话检查一下你是不是下载了正确的ndk版本(例如你的操作系统是linux而下载了windows版的ndk).
Java部分
现在我们用一个很简单的例子来说明NDK的使用。我们在eclipse中新建一个android工程,其中:
Project Name:jnitest
Build Target: Android 1.6
Application Name: JNI Test
Package Name: org.eshock.jnitest
Create Activity: JNITest
JNITest.java:
--------------------------------------------------------------------------------
package org.eshock.jnitest;
import android.app.Activity;
import android.os.Bundle;
public class JNITest extends Activity {
public native int plus (int x, int y);
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int x = plus(1, 2);
android.util.Log.d("jni", String.valueOf(x));
}
static {
System.loadLibrary("mylib");
}
}
--------------------------------------------------------------------------------
我们只是演示NDK,所以就不要界面了。在这个程序中,我们调用一个c语言编写的plus(int, int)函数来计算1+2的值,然后在log中打印它。这个库的名称叫做mylib。
要使用一个c语言的函数,需要在java中声明:
public native int plus(int x, int y);
这样java编译器就知道这个函数是外部库中实现的。
C部分
接下来我们使用C语言实现这个plus函数。
创建<project>/jni/mylib.c:
--------------------------------------------------------------------------------
#include <string.h>
#include <jni.h>
JNIEXPORT jint JNICALL
Java_org_eshock_jnitest_JNITest_plus( JNIEnv* env,
jobject thiz,
jint x,
jint y )
{
return x + y;
}
--------------------------------------------------------------------------------
这里我们看到,mylib.c里的plus函数比java里面的plus函数的签名要复杂了很多,主要是plus前面增加了包名,函数中多了两个参数,以及所有的int变成了jint。关于c中类型与jni中类型的对应关系,可以参见jni的相关文档,例如core Java II中的最后一章。如果你不想去查阅文档,有一个方法:
首先随便在某个目录下创建一个文件JNITest.java:
--------------------------------------------------------------------------------
public class JNITest {
public native int plus (int x, int y);
}
--------------------------------------------------------------------------------
然后在命令行下执行:
javac JNITest.java && javah JNITest
将生成一个文件JNITest.h:
--------------------------------------------------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNITest */
#ifndef _Included_JNITest
#define _Included_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNITest
* Method: plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_JNITest_plus
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
--------------------------------------------------------------------------------
这里自动生成了java中native函数对应的签名,你可以在c代码中使用它。(记得修改包名)。
Android.mk和Application.mk
Android.mk是一个makefile,用来告诉NDK需要编译哪些文件,生成哪些模块。我们创建<jni>/Android.mk文件:
--------------------------------------------------------------------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := mylib.c
include $(BUILD_SHARED_LIBRARY)
--------------------------------------------------------------------------------
其中LOCAL_PATH表示c源代码文件的位置;LOCAL_MODULE表示生成的共享库的名称;LOCAL_SRC_FILES代表c代码的文件。不需要把头文件列在里面;头文件的依赖关系是ndk自动计算的。
Application.mk的作用是告诉Android SDK需要哪些库文件。有了它,NDK就可以把库放在正确的位置。我们创建<project>/Application.mk:
--------------------------------------------------------------------------------
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES := mylib
--------------------------------------------------------------------------------
APP_PROJECT_PATH代表android工程所在目录,在本例中它被放在<project>中; APP_MODULES表示工程需要的库,如果有多个以空格分开。
编译共享库
由于ndk规定Application.mk必须放在<ndk>/apps/project_name,我们在<ndk>下创建一个符号连接:
ln -s <project> <ndk>/apps/jnitest
这样,我们就可以开始编译共享库了:
在<ndk>目录下运行:
make APP=jnitest
--------------------------------------------------------------------------------
Android NDK: Building for application 'jnitest'
Compile thumb : mylib <= apps/jnitest/jni/mylib.c
SharedLibrary : libmylib.so
Install : libmylib.so => apps/jnitest/libs/armeabi
--------------------------------------------------------------------------------
可以看到编译成功,并在<project>/libs/armeabi/下生成了libmylib.so。
测试
在运行之前,首先确认一下你的工程里面各个文件都齐全,应该类似于这样:
然后测试,正常的话应该能看到log中有输出3.
发表评论
-
android push
2011-11-16 15:24 1561所有技术的概要介绍,并讲解了android2.2的新功能C2D ... -
[Android UI界面] 怎么设置popupwindow动画效果?
2011-07-16 12:34 1081http://www.eoeandroid.com/threa ... -
android解析XML
2011-07-11 11:32 1804为移动设备构建 Java 应用程序 Michael ... -
对话框和浮动Activity
2011-07-06 12:07 920在Android中,我们可以通 ... -
升级android sdk时A folder failed to be renamed or moved 错误的解决
2011-06-28 09:22 1661Downloading Android SDK Tools, ... -
android push机制-C2DM
2011-06-27 16:54 1458http://bigcat.easymorse.com/?p= ... -
XML解析
2011-06-24 15:45 814HttpPost httpRequest=new HttpP ... -
android上传图片到服务器,求服务器那边和android的Activity的完整代码。
2011-06-22 12:30 3213服务器端servlet代码:public void doPos ... -
android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
2011-06-08 16:44 965介绍 在 Android 中与服务端做 HTTP 通信,解析 ... -
eclipse 中android中文doc配置
2011-05-13 14:39 913http://hi.baidu.com/huangbz321/ ... -
jesson.shen浅谈HTTP中实现UDP/TCP
2011-05-10 16:38 894http://350526.blog.51cto.com/34 ... -
android 网络编程
2011-05-04 19:54 756http://hi.baidu.com/lfcaolibin/ ... -
android解析xml文件的方式
2011-05-01 22:54 847http://hi.baidu.com/%B2%BD%C2%C ... -
android进程间通信:使用AIDL
2011-04-13 10:59 829http://blog.csdn.net/saintsword ... -
Android实现开机自动运行程序
2011-04-12 18:00 1096有些时候,应用需要在开机时就自动运行,例如某个自动从网上更新内 ... -
android 如何从sqlite读取数据到spinner下拉中显示
2011-04-12 14:56 5535import android.app.Activity; im ... -
Android的SharedPreferences保存与删除数据简单实例
2011-04-12 11:37 519561、创建SharedPreferences对象: Stri ... -
Android使用LayoutInflater动态加载布局和操作控件
2011-04-11 16:22 968http://www.cnmsdn.com/html/2010 ... -
dialog
2011-04-08 18:32 812http://topic.csdn.net/u/2011031 ... -
Android NOtification 使用
2011-04-07 15:55 3782一、 Notification 简介 ...
相关推荐
Android NDK入门
该资源包含了一个AndroidNDK入门项目实战,包括代码和注释,简单易懂!
Android NDK入门 实例 详解
androidndk入门.pdf
android NDK 入门 文档 学习android NDK 的好资料
超强NDK入门项目实战 你只知道 用java编 android吗 试试 c语言的吧 android 游戏必学
android NDK入门篇----混合使用java和c/c++代码 源码工程 包括头文件 源文件以及生成的so库
android ndk安装和入门的小例子,包含应该注意的地方,在csdn博客上。
安卓NDK入门,C与Java方法之间的互相调用,本代码很简单的Demo例子。
学习Android_NDK入门很简单学习Android_NDK入门很简单学习Android_NDK入门很简单学习Android_NDK入门很简单
Android NDK开发的环境配置以及例子说明开发过程
Android NDK入门学习类视频大牛视频分享
android NDK基本操作步骤说明 NDK入门教程。
这是一个ndk入门实例,使用eclipse实现的,很简单且具有参考意义 参考黄书《Android应用安全防护和逆向...Android NDK入门开发实例(https://jingyan.baidu.com/article/37bce2be191ed51003f3a278.html)即可完成该实例
超爽android ndk入门教程,NDK入门项目实战
这个虽然只是个简单的jnidemo、但是涵盖了Android.mk 和Application.mk 的原理 重点是Android NDK编译的理解 mac 系统下 切换到jni目录,然后呢个 ndk-build
android ndk 开发入门。看代码学习android ndk是怎么回事!希望对大家有用!
Android NDK编程入门笔记 开发环境的搭建
史上最强NDK入门项目实战.rar ndk入门很好的资料附代码