当前位置: 首页 > news >正文

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目录下生成相应的动态库文件,此时目录结构如下图所示

 image

8、在工程上右键->run as->Android Application即可在真机上运行,运行结果如下图所示

image

转载于:https://www.cnblogs.com/gordon0918/p/5146148.html

相关文章:

  • 推荐系统原理简析
  • 用谷歌拼音输入法
  • centos7 jsoup java.net.UnknownHostException
  • 今天去超市
  • Path类
  • 更换 Windows 7 的 Windows Media Center 主题
  • 如何卸载rpm包
  • 如何让网页上的Flash视频以弹出窗口播放
  • 难道冬泳都会断子绝孙?
  • pdf转word软件
  • 优酷视频下载器 优酷视频下载方法
  • LeetCode: Surrounded Regions [130]
  • 常用中文字体
  • 2016 - 1 - 23 json转模型 常用的第三方框架
  • 常用英文字体收集备用
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • CentOS 7 修改主机名
  • CentOS7 安装JDK
  • docker python 配置
  • IP路由与转发
  • java概述
  • Netty 4.1 源代码学习:线程模型
  • nodejs实现webservice问题总结
  • Puppeteer:浏览器控制器
  • Spring Boot快速入门(一):Hello Spring Boot
  • Xmanager 远程桌面 CentOS 7
  • 产品三维模型在线预览
  • 创建一个Struts2项目maven 方式
  • 工程优化暨babel升级小记
  • 理清楚Vue的结构
  • 力扣(LeetCode)357
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端存储 - localStorage
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 我的业余项目总结
  • 在Mac OS X上安装 Ruby运行环境
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​​​​​​​​​​​​​​Γ函数
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #1015 : KMP算法
  • #pragma pack(1)
  • #前后端分离# 头条发布系统
  • (30)数组元素和与数字和的绝对差
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (六)激光线扫描-三维重建
  • (实战篇)如何缓存数据
  • (算法)Travel Information Center