捣鼓了一天的NDK,总结下。

Eclipse下开发ndk好像挺麻烦的样子,看书上要下载Cygwin,eclipse还要下载插件CDT。。而在AS上就方便多啦。下载android ndk。安装,配置环境,即可。

NDK(android native develop kits ):android 本地开发工具集 ,这些工具帮助开发者快速开发C或C++动态库,并自动将so和java文件打包成apk,可以把c/c++ ->编译成一个 linux下可以执行的二进制文件 java代码里面就可以通过jni 调用执行二进制的文件.

JNI :java本地开发接口,JNI是一个协议这个协议用来沟通java代码和外部的本地代码(c/c++).通过这个协议,java代码就可以调用外部的c/c++,代码外部的c/c++代码也可以调用java代码。

JNI开发用途:Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车,opengl,ffmpeg等。

一、配置NDK环境

下载NDK,网上有很多,下载好之后,解压即可。然后在AS中配置,依次点击:File ->ProjectStructure:如图:

配置好之后,会在项目下的local.properties文件里自动添加:ndk.dir=D\:\\android-ndk-r10d   如果没有就自己加上,我的是自动的。

二、建立app项目

1.建立一个普通的android project

2.声明原生方法,必须加上native,告诉程序这是一个原生方法。在具体java代码调用时,和调用java的其他方法一样,直接调用就可以了。activity代码:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; public class NDK extends Activity { static {
System.loadLibrary("MyJni");//导入生成的链接库文件
} public native String getStringFromNative();//本地方法
public native String getString_From_c();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ndk);
} public void onClick(View view) {
System.out.println(getString_From_c());
Toast.makeText(this, getStringFromNative(), Toast.LENGTH_LONG).show();
}
}

System.loadLibrary("MyJni");加载库,需要注意的是加载的库名即编译生成的库名,去掉前缀lib和后缀so。

然后make project一下,目的就是编译成对应的class文件。然后根据生成的class文件,利用javah生成对应的 .h头文件。

三、生成.h头文件

1.AS中点击view ->ToolsWindows->Terminal,
cd app\src\main,进入src\main\目录下:
2.执行:
javah -d jni -classpath F:\android\sdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug example.user.ndkdemo2.NDK
这个命令很长,分开慢慢来,javah是生成头文件需要的工具,-d jni 在工程下生成jni目录,到时会在这个目录下建JNI开始的C/C++源文件的。
-classpath F:\android\sdk\platforms\android-23\android.jar 这个就是你SDK文件下android.jar所在的文件位置,找到后复制即可。
..\..\build\intermediates\classes\debug 这个路径如图所示:

example.user.ndkdemo2.NDK就是NDKclass的路径名。

执行完这个命令后,会在main文件夹下自动生成jni目录和.h头文件。

可以打头文件看看:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class example_user_ndkdemo2_NDK */ #ifndef _Included_example_user_ndkdemo2_NDK
#define _Included_example_user_ndkdemo2_NDK
#ifdef __cplusplus
extern "C" {
#endif
#undef example_user_ndkdemo2_NDK_BIND_ABOVE_CLIENT
#define example_user_ndkdemo2_NDK_BIND_ABOVE_CLIENT 8L
#undef example_user_ndkdemo2_NDK_BIND_ADJUST_WITH_ACTIVITY
#define example_user_ndkdemo2_NDK_BIND_ADJUST_WITH_ACTIVITY 128L
#undef example_user_ndkdemo2_NDK_BIND_ALLOW_OOM_MANAGEMENT
#define example_user_ndkdemo2_NDK_BIND_ALLOW_OOM_MANAGEMENT 16L
#undef example_user_ndkdemo2_NDK_BIND_AUTO_CREATE
#define example_user_ndkdemo2_NDK_BIND_AUTO_CREATE 1L
#undef example_user_ndkdemo2_NDK_BIND_DEBUG_UNBIND
#define example_user_ndkdemo2_NDK_BIND_DEBUG_UNBIND 2L
#undef example_user_ndkdemo2_NDK_BIND_IMPORTANT
#define example_user_ndkdemo2_NDK_BIND_IMPORTANT 64L
#undef example_user_ndkdemo2_NDK_BIND_NOT_FOREGROUND
#define example_user_ndkdemo2_NDK_BIND_NOT_FOREGROUND 4L
#undef example_user_ndkdemo2_NDK_BIND_WAIVE_PRIORITY
#define example_user_ndkdemo2_NDK_BIND_WAIVE_PRIORITY 32L
#undef example_user_ndkdemo2_NDK_CONTEXT_IGNORE_SECURITY
#define example_user_ndkdemo2_NDK_CONTEXT_IGNORE_SECURITY 2L
#undef example_user_ndkdemo2_NDK_CONTEXT_INCLUDE_CODE
#define example_user_ndkdemo2_NDK_CONTEXT_INCLUDE_CODE 1L
#undef example_user_ndkdemo2_NDK_CONTEXT_RESTRICTED
#define example_user_ndkdemo2_NDK_CONTEXT_RESTRICTED 4L
#undef example_user_ndkdemo2_NDK_MODE_APPEND
#define example_user_ndkdemo2_NDK_MODE_APPEND 32768L
#undef example_user_ndkdemo2_NDK_MODE_ENABLE_WRITE_AHEAD_LOGGING
#define example_user_ndkdemo2_NDK_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
#undef example_user_ndkdemo2_NDK_MODE_MULTI_PROCESS
#define example_user_ndkdemo2_NDK_MODE_MULTI_PROCESS 4L
#undef example_user_ndkdemo2_NDK_MODE_PRIVATE
#define example_user_ndkdemo2_NDK_MODE_PRIVATE 0L
#undef example_user_ndkdemo2_NDK_MODE_WORLD_READABLE
#define example_user_ndkdemo2_NDK_MODE_WORLD_READABLE 1L
#undef example_user_ndkdemo2_NDK_MODE_WORLD_WRITEABLE
#define example_user_ndkdemo2_NDK_MODE_WORLD_WRITEABLE 2L
#undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_DIALER
#define example_user_ndkdemo2_NDK_DEFAULT_KEYS_DIALER 1L
#undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_DISABLE
#define example_user_ndkdemo2_NDK_DEFAULT_KEYS_DISABLE 0L
#undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_GLOBAL
#define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_GLOBAL 4L
#undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_LOCAL
#define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef example_user_ndkdemo2_NDK_DEFAULT_KEYS_SHORTCUT
#define example_user_ndkdemo2_NDK_DEFAULT_KEYS_SHORTCUT 2L
#undef example_user_ndkdemo2_NDK_RESULT_CANCELED
#define example_user_ndkdemo2_NDK_RESULT_CANCELED 0L
#undef example_user_ndkdemo2_NDK_RESULT_FIRST_USER
#define example_user_ndkdemo2_NDK_RESULT_FIRST_USER 1L
#undef example_user_ndkdemo2_NDK_RESULT_OK
#define example_user_ndkdemo2_NDK_RESULT_OK -1L
#undef example_user_ndkdemo2_NDK_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS
#define example_user_ndkdemo2_NDK_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS 65534L
#undef example_user_ndkdemo2_NDK_HONEYCOMB
#define example_user_ndkdemo2_NDK_HONEYCOMB 11L
#undef example_user_ndkdemo2_NDK_MSG_REALLY_STOPPED
#define example_user_ndkdemo2_NDK_MSG_REALLY_STOPPED 1L
#undef example_user_ndkdemo2_NDK_MSG_RESUME_PENDING
#define example_user_ndkdemo2_NDK_MSG_RESUME_PENDING 2L
/*
* Class: example_user_ndkdemo2_NDK
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getStringFromNative
(JNIEnv *, jobject); /*
* Class: example_user_ndkdemo2_NDK
* Method: getString_From_c
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getString_1From_1c
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif

这个文件中:JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getStringFromNative(JNIEnv *, jobject);这是函数定义,Java_<packege_path>_<class_name>_<method_name>(JNIEnv *, jobject,<parameter_list>);

函数定义中这两个参数:JNIEnv *, jobject是必须的,之后才是需要在函数调用时需要传递的参数,如:

Java_<packege_path>_<class_name>_<method_name>(JNIEnv *, jint value1,jint value2);//jint是什么意思,在后边说明。jint就是代表的Java里的int类型。

四,创建C文件,实现native方法

在jni目录下建立c文件:util.c是一个空文件,这是因为NDK在windows系统上的一个bug,没有会出错,你也可以不建,如果出错再建也没事。

c文件:

#include "example_user_ndkdemo2_NDK.h"
//#include <android/log.h>
//#define LOG_TAG "System.out"
//#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
//#define LOGINFO(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__) JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getStringFromNative
(JNIEnv * env, jobject jobject){
// LOGINFO("LOGINFO");
return (*env)->NewStringUTF(env,"NDK 测试成功");
} JNIEXPORT jstring JNICALL Java_example_user_ndkdemo2_NDK_getString_1From_1c
(JNIEnv * env, jobject jobject){ return (*(*env)).NewStringUTF(env,"NDK 来自于C文件"); }
//
// Created by user on 2016/4/13.
//

最后还有配置一个地方:build.gradle文件的defaultConfig中加ndk

android.mk文件位置:

五、jni.h文件

在jni.h文件中,定义了本地的数据类型和对象的引用类型,编写c代码时要注意必须使用这些定义的数据类型和对象的引用类型

对象数据:

												

AS下NDK开发(一)的更多相关文章

  1. Android下NDK开发环境搭建

    Android下NDK开发环境搭建 1.     AndroidNDK安装与配置 1.1  NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...

  2. Android学习笔记—Windows下NDK开发简单示例

    该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...

  3. Android NDK学习(2)Windows下NDK开发环境配置

    转:http://www.cnblogs.com/fww330666557/archive/2012/12/14/2817386.html 一.配置好Android开发环境 二.下载安装安卓NDK   ...

  4. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  5. Android SDK +Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建

    Android SDK+Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建 这几天一直在研究 Android SDK  C/C++平台的搭建,尽管以前有成功在Windows ...

  6. android studio下的NDK开发详解(一)

    源地址:http://www.voidcn.com/blog/chengkaizone/article/p-5761016.html 好记性不如烂笔头,开始坚持写博客,学一点记一点,只为了生活更好. ...

  7. Android -- Android下的NDK开发(一)

    1,NDK是什么?为什么要进行NDK开发? NDK:Native Development Kit.Android应用运行在Dalvik虚拟机中.NDK允许开发人员使用本地代码语言(例如C和C++)实现 ...

  8. NDK在windows下的开发环境搭建及开发过程

    在Android应用的开发工程中,不管是游戏还是普通应用,都时常会用到.so即动态链接库,关于.so是什么玩意儿,有什么好处,这个大家可以在网上查一下,本人不做过多解释..so本是linux下的文件类 ...

  9. NDK 开发实例一(Android.mk环境配置下)

         在我写这篇文章的时候,Android Studio已经是2.3版本了,已经集成CMake 编译工具, 用户只需在 新建项目的时候,添加选项(Include C++ support),Andr ...

随机推荐

  1. Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive.

    调试网站时,异常出现:Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive. S ...

  2. 视图(View)与部分视图(Partial View)之间数据传递

    写ASP.NET MVC程序,我们经常需要把数据从视图(View)传递至部分视图(Partial View) 或者相反. 今天Insus.NET使用 ControllerBase.TempData 进 ...

  3. Socket开发框架之框架设计及分析

    虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设 ...

  4. Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(2)

    本篇继续上篇<Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(1)>来对Winform开发框架之存储过程的支持进行介绍,上篇主要介绍了SQLServer和Oracle两 ...

  5. 使用POI替换word中的特定字符/文字改进版

    package com.xfzx.test.POI.main; import java.io.File; import java.io.FileInputStream; import java.io. ...

  6. WCF学习笔记1--发布使用配置文件的服务

    关于WCF的入门网上资料很多,可以参考蒋金楠老师的博客http://www.cnblogs.com/artech/archive/2007/02/26/656901.html,我是从这篇博客开始学习的 ...

  7. spring笔记4 spring MVC的基础知识4

    //todo 5,spring MVC的本地化解析,文件上传,静态资源处理,拦截器,异常处理等 spring MVC 默认使用AcceptHeaderLocalResolver,根据报文头的Accep ...

  8. MySQL函数不能创建的解决方法

    MySQL函数不能创建,是一个很麻烦的问题,下面就为您提供了一个解决此问题的方法,如果您也遇到过类似的问题,不妨一看. http://database.51cto.com/art/201010/229 ...

  9. 2016弱校联盟十一专场10.3---We don't wanna work!(STL--set的使用)

    题目链接 https://acm.bnu.edu.cn/v3/contest_show.php?cid=8504#problem/C 代码如下: #include <iostream> # ...

  10. 标签栏使用Demo二

    // //  PHTagViewFrame.m //  标签的使用二 // //  Created by 123 on 16/9/6. //  Copyright © 2016年 彭洪. All ri ...