Android(java)学习笔记259:JNI之NDK开发步骤
1. NDK开发步骤(回忆一下HelloWorld案例):
(1)创建工程
(2)定义native方法
(3)创建jni文件夹
(4)创建c源文件放到jni文件夹
(5)拷贝jni.h头文件到jni目录下(jni.h头文件在ndk目录\platforms\android-14\arch-arm\usr\include)
(6)在c源文件中导入jni头文件
(7)在c源文件中按照jni协议规范生成对应的native方法
返回类型 Java_packagename_className_methodName(JNIEnv* env, jobject obj,……)
(8)叫C代码工程师写好C的实现代码
(9)在C源文件中调用
(10)创建Android.mk文件,放到jni目录下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := .so文件名
LOCAL_SRC_FILES := .c源文件名
include $(BUILD_SHARED_LIBRARY)
(11)进入工程的根目录下,调用ndk-build命令,生成.os文件
(12)在java代码中,加载.os文件:
static {
System.loadLibrary(".so文件名");
}
(13)调用native方法
(14)测试运行
总而言之,JNI开发流程可以概括为下面的步骤:
(1) 在java中声明native方法
(2)编译java源文件得到class文件,然后通过javah命令导出JNI头文件
(3)实现jni方法(java中native声明的方法),使用C、C++实现
(4)编译成so库并在java中调用
2.下面根据上面的步骤,利用一个加法案例(请大家按照上面步骤):
(1)工程结构如下:
(2)代码内容
MainActivity,如下:
package com.himi.add; import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast; public class MainActivity extends Activity { /**
*
* @param a 第一个加数
* @param b 第二个加数
* @return 结果a+b
*/
public native int add(int a, int b);
static {
System.loadLibrary("myadd");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, "res of add(5,8):"+add(5,8), 0).show();
} }
Android.mk,如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myadd
LOCAL_SRC_FILES := add.c
include $(BUILD_SHARED_LIBRARY)
add.c,如下:
#include <jni.h> int add(int a, int b) {
return a+b;
} jint Java_com_himi_add_MainActivity_add(JNIEnv* env, jobject obj, jint a, jint b)
{
return add(a,b);
}
还有就是导入的jni.h文件
libmyadd.so是利用NDK生成的linux库文件
(3)测试略
Android(java)学习笔记259:JNI之NDK开发步骤的更多相关文章
- Android(java)学习笔记203:JNI之NDK开发步骤
1. NDK开发步骤(回忆一下HelloWorld案例): (1)创建工程 (2)定义native方法 (3)创建jni文件夹 (4)创建c源文件放到jni文件夹 (5)拷贝jni.h头文件到jni目 ...
- React+Redux学习笔记:React+Redux简易开发步骤
前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- 20145316许心远《Java学习笔记(第8版)》课程总结
20145316许心远<Java学习笔记(第8版)>课程总结 每周读书笔记链接汇总 ▪ 第一周读书笔记 ▪ 第二周读书笔记 ▪ 第三周读书笔记 ▪ 第四周读书笔记 ▪ 第五周读书笔记 ▪ ...
随机推荐
- Spring mvc 中有关 Shiro 1.2.3 配置问题
Spring 版本:3.2.x, 4.0.x [问题说明] 首先介绍下配置出错情况: (1)项目中,Spring3 and Spring4 的 applicationContext.xml aop ...
- jQuery实现checkbox全选反选及删除等操作
1.list.html 说明:用checkbox数组Check[]存放每一行的ID值 <div id="con"> <table width="100% ...
- Hibernate的CRUD
1.CRUD: C:sesion.save() R:session.get()? session.load() D:session.delete() U:session.update() 2.读取数据 ...
- 在jQuery.getData中renderCallback使用不同创建方式的结果
JavaScript 中需要创建函数的话,有两种方法:函数声明.函数表达式,各自写法如下:// 方法一:函数声明function foo() {}// 方法二:函数表达式var foo = funct ...
- eval函数
eval()函数中的eval是evaluate的简称,这个函数的作用就是把一段字符串当作PHP语句来执行 <?php $a=100;eval("echo $a;"); ...
- jquery hide() show()
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- winform拖动无边框窗体
这个无边框拖动船体,代码很少,却总是记不住,于是就在网上搜了这段代码,记录一下,省的再忘 using System; using System.Collections.Generic; using S ...
- 浅谈Java内存泄露
一.引言 先等等吧……累了
- ionic中使用Cordova Uglify 压缩js与css
参照:https://www.npmjs.com/package/cordova-uglify 安装:npm install cordova-uglify 安装完成之后,打开: hooks/uglif ...
- angular-fullstack test
1:运行yo 提示我可以升级到1.4.7版本,下面进行升级 提示需要npm>=2.8.0下面进行升级npm y@y:angular-fullstack-test$ npm install npm ...