美文网首页
JNI项目搭建

JNI项目搭建

作者: 往事一块六毛八 | 来源:发表于2016-12-18 22:02 被阅读25次

    交叉编译

    • 在一个平台上去编译另一个平台上可以执行的本地代码
    • cpu平台 arm x86 mips
    • 操作系统平台 windows linux mac os
    • 原理 模拟不同平台的特性去编译代码

    jni开发工具

    • ndk native develop kit
    • ndk目录
      • docs 帮助文档
      • platforms 好多平台版本文件夹 选择时选择项目支持的最小版本号对应的文件夹
      • 每一个版本号的文件夹中放了 不同cpu架构的资源文件
      • include文件夹 jni开发中常用的 .h头文件
      • lib 文件夹 google打包好的 提供给开发者使用的 .so文件
      • samples google官方提供的样例工程 可以参考进行开发
      • android-ndk-r9d\build\tools linux系统下的批处理文件 在交叉编译时会自动调用
      • ndk-build 交叉编译的命令
    • cdt eclipse的插件 高亮C代码 C的代码提示

    jnihelloworld

    • jni开发的步骤

    • ①写java代码 声明本地方法 用到native关键字 本地方法不用去实现

    • ②项目根目录下创建jni文件夹

    • ③在jni文件夹下创建.c文件

      • 本地函数命名规则: Java_包名类名本地方法名
      • JNIENV* env JNIEnv 是JniNativeInterface这个结构体的一级指针
      • JniNativeInterface这个结构体定义了大量的函数指针
      • env 就是结构体JniNativeInterface这个结构体的二级指针
      • (*env)->调用结构体中的函数指针
      • 第二个参数jobject 调用本地函数的java对象就是这个jobject
    • ④ 导入<jni.h>

    • ⑤ 创建Android.mk makefile 告诉编译器.c的源文件在什么地方,要生成的编译对象的名字是什么

      LOCAL_PATH := $(call my-dir)

      include $(CLEAR_VARS)

      LOCAL_MODULE := hello #指定了生成的动态链接库的名字
      LOCAL_SRC_FILES := hello.c #指定了C的源文件叫什么名 字

      include $(BUILD_SHARED_LIBRARY)

    • ⑥ 调用ndk-build编译c代码生成动态链接库.so文件 文件的位置 lib->armeabi->.so

    • ⑦ 在java代码中加载动态链接库 System.loadlibrary("动态链接库的名字"); Android.mkLOCAL_MODULE所指定的名字

    • ⑧运行:进入到项目的根目录,cd /d 路径-->ndk-build

    jni开发中的常见错误

    • java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到
      • 本地函数名写错
      • 忘记加载.so文件 没有调用System.loadlibrary
    • findLibrary returned null
      • System.loadLibrary("libhello"); 加载动态链接库时 动态链接库名字写错
      • 平台类型错误 把只支持arm平台的.so文件部署到了 x86cpu的设备上
        • 在jni目录下创建 Application.mk 在里面指定
        • APP_ABI := armeabi
          APP_PLATFORM := android-14
    • javah
      • jdk 1.7 项目 src目录下运行javah
      • jdk 1.6 项目 bin目录下 classes文件夹
      • javah native方法声明的java类的全类名

    运行:cd /d (src 的路径)-->javah native方法声明的java类的全类名

    相关文章

      网友评论

          本文标题:JNI项目搭建

          本文链接:https://www.haomeiwen.com/subject/frnamttx.html