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即可在真机上运行,运行结果如下图所示

时间: 2024-10-10 14:18:05

Android学习笔记—Windows下NDK开发简单示例的相关文章

Scrapy爬虫学习笔记 - windows下搭建开发环境1

一.pycharm的安装和简单使用                                   二.mysql和navicat的安装和使用    三.windows和linux下安装python2和python3                         原文地址:https://www.cnblogs.com/tanrong/p/8496823.html

Windows下NDK开发环境搭建

Cygwin 介绍 cygwin是windwos下的linux环境模拟器.   为什么需要cygwin?  因为NDK只能在Linux环境下运行. 安装流程 1.打开cygwin的可执行文件,执行扩展库安装地址. 我这里选择Install from Local Directory,因为扩展库我已经下载到本地了. 2.选择安装目录,目录名不能有空格或者中文 3.因为选择的是本地安装,所以需要指定插件包 4.选择需要安装的插件,Devel(编译),Shells(执行脚本) 5.安装完成后在点击桌面的

【转】Android NDK学习(2)Windows下NDK开发环境配置

一.配置好Android开发环境 现在android SDK的版本已经到了4.4了,几乎不用配置,下载下来解压,SDK跟Android开发专用Eclipse都有了.喜欢. 二.下载安装安卓NDK 下载最新版,解压即可. 2013年6月7日: 目前版本已经到了r8e. 三.下载安装cygwin   由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从uni

Android学习笔记—第一章 搭建开发环境

第一章 Android开发环境搭建 开发工具:adt-bundle-windows http://pan.baidu.com/s/1wIgFW 配置环境变量 D:\Program Files (x86)\Android\adt-bundle-windows-x86-20131030\sdk\platform-tools 以上是sdk\platform-tools的路径,根据个人电脑上安装路径不同而定.配置好环境变量后,可输入adb命令进行测试. 常用abd命令 (1)查看当前正在运行的模拟器信息

zend framework学习笔记(windows下)

zend framework安装 下载地址:https://framework.zend.com/downloads/archives 修改php.ini文件,将library目录添加到include_path路径中 *如没有权限修改php.ini文件,可以创建.htaccess文件中,在文件中添加php_value include_path ".;library路径",将该文件放在服务器的文档根目录 配置 ①将 php.exe目录添加到系统环境变量中 将zend framework目

Android 学习笔记之 个人认为最简单的查看Android源码方案

相信很多人都会疑惑如何使用Eclipse ADT查看源码? 下面我们将介绍 如何查看Android源码. 本文有如下优点: 1.不用费心去找Android源码地址:一个字烦,网上的东西杂七杂八的... 2.不用担心过程难,这个就三步.. 工具:ADT 第一步:找到你ADT根目录,打开SDK Manager.exe 第二步:勾选你想查看的source for android sdk,下载. 第三步:打开任意一个Android程序使用Ctrl+想要查看的代码,然后跳转到查看源码文件,点击Change

Android学习笔记(二十):回归简单的ListView

在之前连续对ListVew作了逐步深入的探讨,对于手持屏幕来讲,其实可以比较简单,如果别人愿意付钱,不在乎将代码再些一次,这是客户端的开发和复杂服务器的开发不同的地方.当然各人有各人的看法.绝大部分情况下,一个list元素可能左右各有一个widget就差不多,回归简约风格,这也是小尺寸屏幕和手指操作的特点. 在数据的传递,Java里面,具有<Key,Value>的Hash是非常重要的,可以方便增/删/改/查,如果我们不使用数据库存储,或者将数据存放在内存中,<Key,Value>是

Android学习笔记(三五):再谈Intent(下)-一些实践

Android的UI框架要求用户将他们的app分为activity,通过itent来进行调度,其中有一个main activity由Android的launcher在桌面中调用.例如一个日历的应用,需要查看日历的activity,查看单个事件的activity,编辑事件的activity等等.在查看日历的activity中,如果用户选择的某个事件,需要通过查看事件的activity来处理.这就是最近本的app UI框架,本次,我们将学习如何通过intent来完成. Activity之间的关系 某

Android学习笔记(五三):服务Service(下)- Remote Service

之前所谈的Service属于Local Service,即Service和Client在同一进程内(即同一application内),Service的生命周期服从进程的生命周期.在实际应用上,有时希望Service作为后台服务,不仅被同一进程内的activity使用,也可被其他进程所使用,针对这种情况,需要采用bindService,也就是Remote Service的方式. 在Android中,不同app属不同进程(process),进程是安全策略的边界,一个进程不能访问其他进程的存储(例如采