NDK初识
来源:互联网 发布:cad 2016 mac序列号 编辑:程序博客网 时间:2024/06/03 20:00
一、 NDK目录结构
- build ./core XXX.mk 指导工程编译的配置文件
- docs 开发文档
- platforms\android-18\arch-arm\usr\ lib库文件 include头文件
- prebuilt make.exe 工程管理器
- samples 开发的例子
- toolchains 工具链
- ndk-build.cmd 谷歌包装过的make工具
二、 jni开发流程
- 阶段1 编码
- 1.新建android工程,native声明本地方法,调用本地方法
2.工程中新建jni文件夹,文件夹下新建hello.c源文件,源文件内容
#include <jni.h>/** * jni要求c实现本地方法的相应本地函数名 * 要求格式 : Java_包名(包名中的.需要用_代替)_类名_本地方法名 * JNIEnv * env 对应java环境,提供数据转换方法 * jobject obj 调用本地方法的类的对象 */jstring Java_com_itheima_hellofromc_MainActivity_helloFromC(JNIEnv *env, jobject obj) { char buf[] = "hello world from C !";// buf <=> &buf[0] : char * //把c里面char *指向的字符串转换为java中的String对象// jstring (*NewStringUTF)(JNIEnv*, const char*);// typedef const struct JNINativeInterface* JNIEnv // env : JNIEnv * <=> struct JNINativeInterface** //二级结构体指针变量 // (**env).NewStringUTF(); // (*env)->NewStringUTF(); return (*env)->NewStringUTF(env, buf);}
阶段2 编译
1.在jni文件夹下新建Android.mk文件,指导模块的编译
LOCAL_PATH := $(call my-dir) #指定当前目录include $(CLEAR_VARS) #清除LOCAL_XXX变量的值,除了LOCAL_PATHLOCAL_MODULE := hello #指定生成模块的名字,动态库名hello,生成动态库文件名libhello.soLOCAL_SRC_FILES := hello.c #指定生成模块用到所有源文件include $(BUILD_SHARED_LIBRARY) #指定编译目标模块为动态库
2.把ndk-build.cmd路径添加Path环境变量
3.进入jni目录路径,打开命令行执行ndk-build.cmd,会编译和安装libhello.so库
[armeabi] Compile thumb : hello <= hello.c[armeabi] SharedLibrary : libhello.so[armeabi] Install : libhello.so => libs/armeabi/libhello.so
三、 jni开发中常见错误
1.找不到库 Caused by: java.lang.UnsatisfiedLinkError: Couldn’t load calc-jn1: findLibrary returned null
- 原因1:加载的库名实际库名不一致
- 原因2:生成的.so文件目标处理器平台与运行平台不一致,解决办法,在jni文件夹下新建Application.mk,添加内容 APP_ABI := all
2.找不到方法java.lang.UnsatisfiedLinkError: Native method not found: com.itheima.resultfromc.MainActivity.resultFromC:(II)I
- 原因1:本地方法名不符合规范
- 原因2:没有加载动态库
四、 javah生成jni头文件
jdk1.6 在工程的02_ResultFromC\bin\classes 和com的同层目录执行javah命令
jdk1.7 在工程的02_ResultFromC\src 和com的同层目录执行javah命令
D:\jni02\code\02_ResultFromC\src>javah com.itheima.resultfromc.MainActivity生成com_itheima_resultfromc_MainActivity.hJNIEXPORT jint JNICALL Java_com_itheima_resultfromc_MainActivity_result_1from_1c (JNIEnv *, jobject, jint, jint);
五、 eclipse结合NDK开发
- 1.新建工程,声明本地方法,调用本地方法
- 2.给eclipse指定ndk路径
- 3.添加本地支持,自动生成jni文件及cpp源文件,Android.mk文件,改后缀名
- 4.添加jni头文件路径
- 5.javah命令生包含本地函数名头文件,把头文件拷贝jni文件夹,本地函数名拷贝到源文件,实现功能
- 6.添加加载动态库语句
- 7.运行程序,自动编译
0 0
- NDK初识
- NDK开发-初识NDK
- NDK初识与使用
- Android—初识NDK
- Android studio 初识ndk开发
- 初识 Android Native Development Kit (NDK)
- 初识cocos2d-x ndk编译相关
- 初识JNI之-Android Ndk环境搭建
- Android初识JNI-搭建NDK开发环境
- 踩坑记录(2)-初识ndk
- Android之NDK开发(三)C++初识
- android NDK 教程一(初识JNI--hello world)
- Android之NDK开发(一)C语言初识
- ndk
- NDK
- NDK
- NDK
- ndk
- 使用git管理puppet运行环境与配置版本
- 浅谈对象和过程
- 数据库之SQL基本语法
- 约瑟夫环的list递归和链表两种实现(java)
- Ry’s Objective-C Tutorial---Memory Management
- NDK初识
- LintCode-剑指Offer-(68)二叉树的后序遍历
- ubuntu14.04,安装VirtualBox 5.0(虚拟机软件)!
- Ry’s Objective-C Tutorial---Objective-C Data Types
- 用BroadcastReceiver监听蓝牙
- 使用过滤器和拦截器做访问权限限制
- Ry’s Objective-C Tutorial → Data Types---C Primitives
- Ry’s Objective-C Tutorial → Data Types---NSNumber
- Ry’s Objective-C Tutorial → Data Types---NSDecimalNumber