android NDK 笔记
*************************************************华丽的分割线**************************************************************
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 笔记的更多相关文章
- Android NDK笔记
目录 Android NDK笔记 AOSP Android repository Android SDK / SDK Tools NDK cmake && ninja lldb adb ...
- Android NDK开发及OpenCV初步学习笔记
https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...
- [笔记] Android NDK 开发笔记
学习下Android NDK的开发,做些笔记记录下. [笔记] Windows下使用Android Studio 创建缺省工程 [笔记] Windows下使用Android Studio开发NDK的最 ...
- Android NDK JNI 入门笔记-day04-NDK实现Hash算法
* Android NDK JNI 入门笔记目录 * 开头 前面的学习,我们已经掌握了 NDK 开发的必备知识. 下一步就要多实践,通过创造问题并解决问题,来增加熟练度,提升经验. 日常开发中,经常会 ...
- (转)Android: NDK编程入门笔记
转自: http://www.cnblogs.com/hibraincol/archive/2011/05/30/2063847.html 为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代 ...
- [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过期网上 ...
- c++/cmake /Android NDK 动态链接库交叉编译笔记
项目使用cmake管理,由于项目的需要,核心代码要求跨 Linux/Windows/Android 三平台.Windows和Linux都好说,但Android NDK费了一番功夫还是没有解决.临时的解 ...
- Android NDK 开发(三)--常见错误锦集合Log的使用【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511 Android NDK开发经常因某些因素会出现一些意想不到的错误, ...
- Android NDK环境配置
之前做了一个基于ffmpeg的软解播放器,熟悉了NDK开发的配置环境过程,但是由于太忙一直没有时间写笔记. 首先,介绍一下在这里所参与协作的软件包: 1. JDK: 这个软件被Eclipse依赖. 2 ...
随机推荐
- Serach
1.二分查找 public class BubbleSort { public static int binarySerach(int[] a,int value){ int low=0; int h ...
- STL学习系列一:STL(标准模板库)理论基础
STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的从广 ...
- 多个分布式系统如何共享使用一个固定公网IP
传统的做法,一个分布式业务系统就有一个中间件,一个中间件需要使用至少一个固定公网IP,这样的话,多个业务系统就需要使用多个固定公网IP. 大家知道,固定公网IP价格可是不菲的.能不能让多个分布式业务系 ...
- msp430的两本书 电子版【worldsing笔记】
msp430的两本书,pdf版 MSP430系列单片机接口_技术及系统设计实例 MSP430系列16位超低功耗单片机原理与应用 点击此处下载 ourdev_528863.pdf(文件大小:4.21M) ...
- 射频识别技术漫谈(5)——防冲突【worldsing 笔记】
正常情况下读写器某一时刻只能对磁场中的一张射频卡进行读写操作.但是当多张卡片同时进入读写器的射频场时,读写器怎么办呢?读写器需要选出唯一的一张卡片进行读写操作,这就是防冲突. 防冲突机制是非接触式智能 ...
- 重看Decorator Pattern,联想到Delegate传递及Flags Enum--欢迎拍砖!
话说装饰模式(Decorator)的动机是“动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活.[GOF <设计模式>]”.再次学到该模式,有感 ...
- JavaScript要点(十) HTML DOM - 改变 HTML
HTML DOM 允许 JavaScript 改变 HTML 元素的内容. A.改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu Oct 13 2 ...
- 【不积跬步,无以致千里】五个常用的Linux监控脚本代码
为大家提供五个常用Linux监控脚本(查看主机网卡流量.系统状况监控.监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告.监控CPU和内存的使用情况.全方位监控主机),有需要的朋友不妨看 ...
- Java文件操作源码大全
Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...
- 正则化方法 exec 和match以及test
var patt=new RegExp(/\d+/g); var str="dfgdfg5465yhhgh65y65hh41"; var result; // var reset= ...