Android学习笔记—Windows下NDK开发简单示例
该示例假设Android开发环境已经搭建完成,NDK也配置成功;
1、在Eclipse上新建Android工程,名称为ndkdemo。修改res\layout\activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" > <TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> </RelativeLayout>
2、在工程src的com.example.ndkdemo目录下右键新建类NativeLoad.java内容如下
package com.example.ndkdemo; public class NativeLoad { static {
/*在静态块中加载底层so库*/
System.loadLibrary("calculator");
} /*声明native方法,其实现有C代码实现*/
public static native int add(int x, int y);
public static native int sub(int x, int y);
public static native int mul(int x, int y);
public static native int div(int x, int y);
}
3、修改com.example.ndkdemo目录下的MainActivity.java,使计算结果显示在屏幕上
package com.example.ndkdemo; import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TextView textView = (TextView)findViewById(R.id.result); textView.setText("100 + 10 = " + NativeLoad.add(100, 10) + "\n");
textView.append("100 - 10 = " + NativeLoad.sub(100, 10) + "\n");
textView.append("100 * 10 = " + NativeLoad.mul(100, 10) + "\n");
textView.append("100 / 10 = " + NativeLoad.div(100, 10) + "\n");
}
}
4、命令行进入工程目录,执行javah命令,生成头文件
javah -classpath src com.example.ndkdemo.NativeLoad
javah -classpath bin\classes com.example.ndkdemo.NativeLoad
这一步用了好长时间,有的提示com.example.ndkdemo.NativeLoad没有找到,有的提示Android.app.Activity没有找到。
在网上找的有的说进入到src目录执行该命令,有的说进入bin目录下执行。<Android框架揭秘>上说类生成的class文件在bin\com\example\ndkdemo\目录下;莫衷一是,现根据自己的理解总结如下
- 在哪个目录执行不是关键,主要是-classpath参数后指定的目录,可以指定class文件所在的包,也可以指定java文件所在的包
- 可能以前版本的目录结构是bin\com\example\ndkdemo这样的,但是我的这个版本上在bin目录下有套了一个classes目录,是这样的bin\classess\com\example\ndkdemo
- 上述两条分别指定的是java文件所在的包和生成的class文件所在包
- classpath不是指定类所在的目录,而是指定类所在包的路径,及src或者bin\classess目录下
5、在工程上右键新建jni目录,在jni目录中新建calculator.c文件,内容如下
#include <jni.h> JNIEXPORT jint JNICALL Java_com_example_ndkdemo_NativeLoad_add
(JNIEnv *env, jclass jclazz, jint x , jint y)
{
return x + y;
} /*
* Class: com_example_ndkdemo_NativeLoad
* Method: sub
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_ndkdemo_NativeLoad_sub
(JNIEnv *env, jclass jclazz, jint x , jint y)
{
return x - y;
} /*
* Class: com_example_ndkdemo_NativeLoad
* Method: mul
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_ndkdemo_NativeLoad_mul
(JNIEnv *env, jclass jclazz, jint x , jint y)
{
return x * y;
} /*
* Class: com_example_ndkdemo_NativeLoad
* Method: div
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_ndkdemo_NativeLoad_div
(JNIEnv *env, jclass jclazz, jint x , jint y)
{
return x/y;
}
6、在jni目录下新建编译脚本Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := calculator
LOCAL_SRC_FILES := calculator.c include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH: 指定NDK编译的基本文件目录,my-dir是一个宏定义,用户返回mk文件所在的目录;这句话的意思是将$(call my-dir)获取的mk所在路径追加给LOCAL_PATH
include $(CLEAR_VARS) : 用来初试化mk文件中以LOCAL_XXX格式的变量,作为全局变量
LOCAL_MODULE:即生成的动态库的名称,必须与Java代码中System.loadLibrary中的名称保持一致
LOCAL_SRC_FILES:生成动态库所需要的源码文件
include $(BUILD_SHARED_LIBRARY): 要创建的是libXXX.so格式的动态库
7、命令行进入工程所在目录,执行ndk-build命令,即在libs目录下生成相应的动态库文件,此时目录结构如下图所示
8、在工程上右键->run as->Android Application即可在真机上运行,运行结果如下图所示
Android学习笔记—Windows下NDK开发简单示例的更多相关文章
- 学习笔记——Windows下cocos2d-x,eclipse中自编译
cocos2d-x创建的安卓项目导入eclipse后. 在项目属性中配置Builders. 在eclipse编译还需要配置相应的变量,即后面提到的cygwin编译中要添加的变量. D:/cygdriv ...
- Android NDK学习(2)Windows下NDK开发环境配置
转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817386.html 一.配置好Android开发环境 二.下载安装安卓NDK ...
- Android学习笔记01-Mac下搭建Java开发环境
一 安装JDK 下载 mac 下专用的jdk1.7, 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downlo ...
- 【Android学习】Windows下Android环境搭建
一. JDK下载配置 直接百度,很简单. 二.android JDK下载配置 1.进入下载官网(需要FQ):https://developer.android.com/studio/index.ht ...
- MongoDB学习笔记—windows下安装
1.登录官网下载安装包 官网下载地址:https://www.mongodb.com/download-center?jmp=nav#community 根据你的系统下载 32 位或 64 位的 .m ...
- Android学习笔记(一)开发环境搭建
Android开发环境搭建 安装JDK 1.如果你还没有JDK的话,可以去这里http://www.oracle.com/technetwork/java/index.html ,接下来的工作就是安装 ...
- Android学习笔记02-Mac下编译java代码
在Mac OS上配置JDK 1.7. 一 下载 Mac版本的JDK1.7 从以下下载地址,下载Mac版本的JDk1.7 安装文件 jdk-7u79-macosx-x64.dmg. http://www ...
- Android 学习笔记之 个人认为最简单的查看Android源码方案
相信很多人都会疑惑如何使用Eclipse ADT查看源码? 下面我们将介绍 如何查看Android源码. 本文有如下优点: 1.不用费心去找Android源码地址:一个字烦,网上的东西杂七杂八的... ...
- Android SDK +Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建
Android SDK+Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建 这几天一直在研究 Android SDK C/C++平台的搭建,尽管以前有成功在Windows ...
随机推荐
- Mysql 细节记忆
DELIMITER $$ 和 DELIMITER ; DROP PROCEDURE IF EXISTS `pro_follow_getBookBeforeExpired`$$ DECLARE p_Se ...
- C#中public、private、protected、internal、protected internal (转载)
在C#语言中,共有五种访问修饰符:public.private.protected.internal.protected internal.作用范围如下表:访问修饰符 说明public 公有访问.不受 ...
- Geodatabase - 创建要素类.
在NET中,会遇到以“_2”结尾的属性,这些属性是可写的. 以下代码在已有工作空间下,创建一个新的点要素类: //例如,personalDBPath=@"G:\doc\gis\1.400\d ...
- 脚本化HTTP
1.HTTP: 定义:超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协 ...
- ubuntu14.04中解压缩window中的zip文件,文件名乱码的解决方法
在windows上压缩的文件,是以系统默认编码中文来压缩文件.由于zip文件中没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出现乱码. 通过unzip行命令解压,指定字符 ...
- jquery 图片滚动
效果图: $(function(){ $("#roll-img2").html($("#roll-img").html()); function r ...
- 【干货】.NET开发通用组件发布(一) 介绍
组件介绍 集合个人和团都开发中遇到的一些通用组件,邮件发送组件.内容采集.CSV数据文件导入工具.日志记录组件.MVC验证登陆组件.MVC分页组件.短信发送组件和强大的Repeate和Repeater ...
- Identify Smith Numbers
Link: https://www.hackerrank.com/challenges/identify-smith-numbers def sum_digits(n): return sum(int ...
- Yoga安装Ubuntu后,wifi和亮度调节问题
http://askubuntu.com/questions/318608/lenovo-yoga-13-realtek-wireless-driver/358479#358479 http://it ...
- 为什么1Byte=8bit
Byte是字节的意思,而字节在早期计算机内部是用标准ASCII码来表示的根据当时情况确定至多有128种需要表示的字符(当时是IBM的标准,现在普遍是255),也就是2的7次方用二进制的0和1来表示就需 ...