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