*************************************************华丽的分割线**************************************************************
NDK 开发步骤
1.创建一个项目
2.创建JNI目录
3.编写nativejava层方法
4.生成JNI头文件
(1)编写javaNative代码
(2)介绍一个命令javah
(3)添加android.jar包到环境变量

声明一个native方法

创建JNI目录

控制台进入当前项目目录

输入命令
E:\android workspace\HelloNDK_1>javah -classpath bin/classes;D:\android\android_
sdk_windows\platforms\android-19\android.jar -d jni com.example.hellondk_1.MainA
ctivity
生成JNI头文件(其中,D:\android\android_sdk_windows\platforms\android-19\android.jar,
是android sdk目录下的目录文件,为了简单,可以把android.jar文件目录添加到path路径下;
最后com.example.hellondk_1.MainActivity是包名加类名)

刷新项目可以看到jni目录下多了一个.h文件

创建一个.c文件导入相应的头文件
(
如:创建一个hello.c文件
#include<stdio.h>
#include<stdlib.h>
#include"com_example_hellondk_1_MainActivity.h"

JNIEXPORT jstring JNICALL Java_com_example_hellondk_11_MainActivity_getStringFromC
(JNIEnv *env, jclass jclass){

return (*env)->NewStringUTF(env, "Hello from C !....");
}
其中实现了头文件中的方法Java_com_example_hellondk_11_MainActivity_getStringFromC(JNIEnv *, jclass);
)

在jni目录下添加mk文件。(这个可以导入ndk的实例下面的mk文件然后做修改就可以了)如下
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)
其中,
LOCAL_MODULE 表示编译生成的so叫什么名字
LOCAL_SRC_FILES 表示要编译的.c文件是哪个

最后在项目路径下执行ndk-build命令。
执行完之后对项目进行刷新可以看到项目下面多了一个obj目录里面多了一个.so文件。
然后在java文件中添加静态代码块。添加.so文件。

最后运行代码就可以看到结果了。
*************************************************华丽的分割线**************************************************************
JNIEnv* env表示当前线程的环境
jobject thiz表示当前的实例
jint si 表示一个int类型的变量
jfieldID fid表示一个字段或者java某一个属性。
jclass cls表示一个类或实例
jmethodID mid表示某个类里面的某个方法的id

cls=(*env)->GetObjectClass(env,thiz);
mid=(*env)->GetStaticMethodID(env,cls,"callback","()V")//第三个参数表示一个静态方法名

fid=(*env)->GetStaticFieldID(env,cls,"si","I");//后面两个表示变量名和数据类型

si=(*env)->GetStaticIntFieldId(env,cls,fid);//取得fid这个字段里面的si数据赋值给si

LOCAL_LDLIBS+=-llog//在mk文件中添加日志库

#include<android/long.h>//在c文件中添加这个头文件加入android开发的log
_android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","xxx");//打印信息
_android_log_print(ANDROID_LOG_INFO,"stringFromJNI()","var=",var);//打印变量信息

java---->jni----->c/c++数据转换顺序

JNI数组处理

很多方法可以在D:\android\android-ndk-r9c\platforms\android-16\arch-arm\usr\include\h=jni.h头文件里面查看还有官方文档

*************************************************华丽的分割线**************************************************************
Eclipse配置ndk开发(参考视频教程:http://www.imooc.com/video/8028)
一、在Eclipse中选择ndk目录(Window--->Preferences--->Android---->NDK---->在NDK Location中选择ndk的目录位置)

二、配置生成javah选项
选择External Tools(运行按钮旁边的那个里面)----->选择Program右键new----->输入Name(如generate_c++_header_file)
----->在Main标签页下选择Variables(选择System_path然后加冒号:添加javah)------>然后选择Working Directory
添加Variables(选择project_loc然后添加\jni例如"${project_loc}\jni")------>然后添加Arguments参数
(-classpath ${project_loc}\bin\classes;D:\android\android_sdk_windows\platforms\android-19\android.jar -d
${project_loc}\jni -jni ${java_type_name})其中$xxx可以在Eclipse里面选择。----->最后run出现eclipse出现的
错误不要管。
使用即在项目下面新建一个jni目录。然后在java文件里面添加native方法,然后选中这个java文件,然后选择运行按钮
旁边的绿色按钮选择我们配置好的generate_c++_header_file点击运行,然后刷新一下就可以看到jni目录下面生成了.h文件
(注意:工作目录最好不要带空格否则会出现一些错误)。

三、配置eclipse添加native支持jni方法代码提示
在工作目录右键选择android Tools--->add native support
选择项目右键选择properties---->C++General--->Path and Symbols--->Includes下add---->File System
(选择ndk所在目录下的include:例如"D:\android\android-ndk-r9c\platforms\android-19\arch-arm\usr\include")
然后单击应用,然后项目下面就多了一个Includes文件夹
然后就可以在编写jni代码的时候按住ctrl+alt或alt+/得到代码提示

四、配置生成javap选项
类似配置javah,
Location为${system_path:javap}
Working Directory为${project_loc}
Arguments为-classpath ${project_loc}\bin\classes -s -p ${java_type_name}

还可以配置ndk-build命令

*************************************************华丽的分割线**************************************************************
JNI数据类型讲解
(
参考官网:http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/types.html#wp428
或者博客:http://blog.csdn.net/conowen/article/details/7523145
)
*************************************************华丽的分割线**************************************************************

android NDK 笔记的更多相关文章

  1. Android NDK笔记

    目录 Android NDK笔记 AOSP Android repository Android SDK / SDK Tools NDK cmake && ninja lldb adb ...

  2. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  3. [笔记] Android NDK 开发笔记

    学习下Android NDK的开发,做些笔记记录下. [笔记] Windows下使用Android Studio 创建缺省工程 [笔记] Windows下使用Android Studio开发NDK的最 ...

  4. Android NDK JNI 入门笔记-day04-NDK实现Hash算法

    * Android NDK JNI 入门笔记目录 * 开头 前面的学习,我们已经掌握了 NDK 开发的必备知识. 下一步就要多实践,通过创造问题并解决问题,来增加熟练度,提升经验. 日常开发中,经常会 ...

  5. (转)Android: NDK编程入门笔记

    转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...

  6. [Cocos2d-x学习笔记]Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawk解决方案

    Android NDK: Host 'awk' tool is outdated. Please define NDK_HOST_AWK to point to Gawk or Nawkawk过期网上 ...

  7. c++/cmake /Android NDK 动态链接库交叉编译笔记

    项目使用cmake管理,由于项目的需要,核心代码要求跨 Linux/Windows/Android 三平台.Windows和Linux都好说,但Android NDK费了一番功夫还是没有解决.临时的解 ...

  8. Android NDK 开发(三)--常见错误锦集合Log的使用【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误, ...

  9. Android NDK环境配置

    之前做了一个基于ffmpeg的软解播放器,熟悉了NDK开发的配置环境过程,但是由于太忙一直没有时间写笔记. 首先,介绍一下在这里所参与协作的软件包: 1. JDK: 这个软件被Eclipse依赖. 2 ...

随机推荐

  1. SSH权威指南(转载)

    本书是一本介绍通信安全的书籍,如果你想保障你的通信安全,本书能给你一个很好的解决方案.本书从ssh协议介绍起,到具体的开源实现和商业实现.但本书同时介绍开源实现和商业实现,给人感觉比较乱.注意:由于o ...

  2. nyoj 6 喷水装置(一)

    喷水装置(一) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以 ...

  3. 在多线程中进行UI操作

    那么在子线程中的UI操作如何处理呢?有两种方法: 一:在子线程,你需要进行的UI操作前添加dispatch_async函数,即可将代码块中的工作转回到主线程 dispatch_async(dispat ...

  4. 我被eclipse的tomcat坑的经历

    奇怪的乱码问题: 1.jsp页面utf-8 2.java代码utf-8 3.数据库编码utf-8 4.tomcat server.xml配置URIEncoding="UTF-8" ...

  5. [一位菜鸟的COCOS-2D编程之路]打飞机中机种敌机和战机损毁时的爆炸效果

    1.第一步,添加爆炸动画 //添加玩家飞机飞行动画 id _playerFlyAction; id _playerBlowupAnimation; //战机爆炸动画 id _enemyBlowupAn ...

  6. Java中的二维数组

    Java 中的二维数组 所谓二维数组,可以简单的理解为是一种"特殊"的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空 ...

  7. Oracle 监听器无法启动(TNS-12555,TNS-12560,TNS-00525)

    启动监听器无法打开,报错! [oracle@localhost ~]$ lsnrctl start LSNRCTL for Linux: Version 11.2.0.1.0 - Production ...

  8. (Map)利用Map,完成下面的功能:  从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队。如果该 年没有举办世界杯,则输出:没有举办世界杯。  附:世界杯冠军以及对应的夺冠年份,请参考本章附录。 附录 (Map)在原有世界杯Map 的基础上,增加如下功能: 读入一支球队的名字,输出该球队夺冠的年份列表。 例如,读入“巴西”,应当输出 1958 1962 1970 1

    package homework001; import java.util.HashMap; import java.util.Scanner; public class Map { public s ...

  9. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  10. 征服 Nginx + Tomcat

    2年前一直折腾Apache,现如今更习惯Nginx. 搭建网站又遇到2年前遇到的问题——Session同步. (参考我以前的帖子——征服 Apache + Tomcat)只不过现今担当负载均衡的Apa ...