使用NDk的场景:

1.某些方法,是使用C,C++本地代码实现的,然后,我想在Java中调用这些方法。这个时候,就需要使用到JNI技术。

应用NDK的时候,分两个部分,Java部分,JNI层部分,本地代码部分。

Java部分,看一个例子:

public class JNIActivity extends Activity {

  static{

    System.loadLibrary("myjni");
} public native String getMessage(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); TextView textView = new TextView(this);
textView.setText(getMessage()); setContentView(textView);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.jni, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

Java部分,要做的事情就是:1.声明要使用的本地方法,使用关键字native。2.加载包含实现该方法的库(在windows平台下是dll;在类Unix平台下是.so)。

JNI层部分,则应用了JNI部分的知识,比如:

#include <jni.h>
#include "include/HelloJNI.h" JNIEXPORT jstring JNICALL Java_com_mytest_JNIActivity_getMessage
(JNIEnv *env, jobject thisObj) {
return (*env)->NewStringUTF(env, "Hello from native code!");
}

用一个简单的例子说明NDK的开发步骤:

1.一个使用本地方法的Java类JNIActivity,声明使用C,C++代码实现的本地方法使用native关键字;载入动态库,此时动态库还没有生成。

结果如下:

public class JNIActivity extends Activity {

  static{

    System.loadLibrary("myjni");
} public native String getMessage(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); TextView textView = new TextView(this);
textView.setText(getMessage()); setContentView(textView);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.jni, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

2.在项目一级目录下创建jni文件夹;在jni文件夹下创建include文件夹。include文件夹,用来存放头文件。

3.使用javah生成头文件---静态函数注册,将java层调用的本地方法与JNI层实现的方法进行关联

在src目录下,使用命令:javah com.mytest.JNIActivity。

类JNIActivity.java使用了原生方法;JNIActivity.java存放在src目录下。

使用上述命令之后,在src目录下会有一个头文件:com_mytest_JNIActivity.h。

将该头文件,复制到jni/include目录下,修改名字为HelloJNI.h。

HelloJNI.h的内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_mytest_JNIActivity */ #ifndef _Included_com_mytest_JNIActivity
#define _Included_com_mytest_JNIActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_mytest_JNIActivity
* Method: getMessage
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_mytest_JNIActivity_getMessage
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

4.创建原生代码

用原生代码实现头文件(HelloJNI.h)中所声明的方法。创建HelloJNI.c,存放在jni目录下。

HelloJNI.c:

#include <jni.h>
#include "include/HelloJNI.h" JNIEXPORT jstring JNICALL Java_com_mytest_JNIActivity_getMessage
(JNIEnv *env, jobject thisObj) {
return (*env)->NewStringUTF(env, "Hello from native code!");
}

5.创建Android.mk

Android.mk文件,描述编译信息。

创建一个Android.mk文件,存放在jni目录下

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := myjni
LOCAL_SRC_FILES := HelloJNI.c include $(BUILD_SHARED_LIBRARY)

其中myjni,是一个动态库名称,它来自于java层代码,System.loadLibrary("myjni");。这个名字要与Java层中加载的动态库名称相同。

HelloJNI.c,是实现原生方法的源代码。

有关Android.mk更详细的内容,请参看Android官方文档。

6.编译

确保已经安装了NDK;并且把ndk-build对应的路径添加到系统的Path变量中。

在项目的一级目录,执行命令ndk-build。

如下:

这样就编译成功了。

7.运行

运行App。

总结:

NDK的使用中,关键就是,创建头文件,编写Android.mk。在实现原生方法的时候,就是应用JNI方面的知识了。

NDK---使用,开发步骤的更多相关文章

  1. Android(java)学习笔记259:JNI之NDK开发步骤

    1. NDK开发步骤(回忆一下HelloWorld案例): (1)创建工程 (2)定义native方法 (3)创建jni文件夹 (4)创建c源文件放到jni文件夹 (5)拷贝jni.h头文件到jni目 ...

  2. Android(java)学习笔记203:JNI之NDK开发步骤

    1. NDK开发步骤(回忆一下HelloWorld案例): (1)创建工程 (2)定义native方法 (3)创建jni文件夹 (4)创建c源文件放到jni文件夹 (5)拷贝jni.h头文件到jni目 ...

  3. NDK 的开发流程

    1.NDK开发所需要的工具 windows 需要在windows下的环境 把c代码打包成 手机能用的函数库 首先模拟手机的环境 1 NDK .sh linux 批处理文件 .bat windows 头 ...

  4. Android(java)学习笔记262:JNI之工具快速开发步骤

    下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...

  5. [Android] AndroidStudio + JNI(NDK)开发相关总结

    1.官方推荐JNI构建方案 从Android studio 2.2 开始,Google推荐的JNI开发构建工具是CMake而不是NDK,参考官方文档:https://developer.android ...

  6. Android(java)学习笔记206:JNI之工具快速开发步骤

    下面通过一个案例说明一下,利用工具jni快速开发步骤 1.新建一个Android工程,命名为"03_对int数组加1",如下: 2. 在MainActivity.java中对add ...

  7. AndroidStudio如何配置NDK/JNI开发环境

    参考文章: http://www.th7.cn/Program/Android/201509/550864.shtml http://www.open-open.com/lib/view/open14 ...

  8. 【OpenWRT】【RT5350】【三】MakeFile文件编写规则和OpenWRT驱动开发步骤

    一.Makefile文件编写 http://www.cnblogs.com/majiangjiang/articles/3218002.html 可以看下上面的博客,总结的比较全了,在此不再复述 二. ...

  9. iOS应用内付费(IAP)开发步骤列表

    iOS应用内付费(IAP)开发步骤列表 前两天和服务端同事一起,完成了应用内付费(以下简称IAP, In app purchase)的开发工作.步骤繁多,在此把开发步骤列表整理如下.因为只是步骤列表, ...

随机推荐

  1. SQL Server 复制:事务发布(读写分离)

    一.背景 在复制的运用场景中,事务发布是使用最为广泛的,我遇到这样一个场景:在YangJiaLeClub数据库中有表.存储过程.视图.用户定义函数,需要提供给其它程序读取放入缓存,程序需要比较及时的获 ...

  2. OSG学习:矩阵变换节点示例

    #include<osgViewer\Viewer> #include<osg\Node> #include<osg\Geode> #include<osg\ ...

  3. phpcms开启在线编辑模版 方法

    目录:\caches\configs\system.php 将:第20行 'tpl_edit'=> 0   修改为  'tpl_edit'=> 1   (0:默认的,不开启:     1: ...

  4. C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  5. 【EF】EF扩展库(批量操作)

    EF删除和修改数据只能先从数据库取出,然后再进行删除 delete from Table1 where Id>5; update Table1 set Age=10; 我们需要这样操作 //删除 ...

  6. matlab中prod的使用方法

    B = prod(A) 将A矩阵不同维的元素的乘积返回到矩阵B. 如果A是向量,prod(A)返回A向量的乘积.如果A是矩阵,prod(A)返回A每一列元素的乘积并组成一个行向量B. B = prod ...

  7. 【bzoj1212】[HNOI2004]L语言 AC自动机

    题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...

  8. Chrome查看html样式基本操作-div

    1. div 标签(白板,块级标签),想学会前端,只需要学会div+css就可以了. span 标签 (白板,行内标签) 2. Chrome审查元素的使用.右击浏览器--检查---可以看标签是块级还是 ...

  9. BZOJ4753:[JSOI2016]最佳团体——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4753 JSOI信息学代表队一共有N名候选人,这些候选人从1到N编号.方便起见,JYY的编号是0号. ...

  10. linux 下文件重命名/移动/复制命令(转)

    linux 下文件重命名/移动/复制命令(转) linux下重命名文件:使用mv命令就可以了, 例:要把名为:abc   重命名为:123 可以这样操作: 重命名:MV命令 1.进入你的文件目录,运行 ...