JNI学习笔记

JNI全称: java native interface

C字符串不检查下标越界 

eclipse开发JNI较原始步骤(了解):

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

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

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

  Application.mk这个文件里面可以指定模拟器的类型:APP_ABI := armeabi

  C文件中本地函数命名规则: Java_包名_类名_本地方法名

  

  JNIENV* env JNIEnv 是JniNativeInterface这个结构体的一级指针 

      JniNativeInterface这个结构体定义了大量的函数指针
       env 就是结构体JniNativeInterface这个结构体的二级指针
       (*env)->调用结构体中的函数指针
      第二个参数jobject 调用本地函数的java对象就是这个jobject

④ C语言中导入<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所指定的名字

 ⑧调用本地方法:

jni开发中的常见错误

  • java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到
    • 本地函数名写错:如果你的本地函数名有下划线,那么在下划线后面加个1  
    • 忘记加载.so文件 没有调用System.loadlibrary* findLibrary returned null

* findLibrary returned null
    * System.loadLibrary("libhello"); 加载动态链接库时 动态链接库名字写错
    * 平台类型错误 把只支持arm平台的.so文件部署到了 x86cpu的设备上 
        * 在jni目录下创建 Application.mk 在里面指定 
        * APP_ABI := armeabi
          APP_PLATFORM := android-14

自动生成JNI中本地函数的头文件:javah

 * jdk 1.7 项目 src目录下运行javah

javah后面接你本地方法声明在哪个类里面就把那个类的全类名拿过来放在后面


    * jdk 1.6 项目 bin目录下 classes文件夹
    * javah native方法声明的java类的全类名 

 eclipse开发JNI较简便步骤:

① 写java代码 native 声明本地方

② 添加本地支持 右键单击项目->andorid tools->add native surport

* 如果发现 finish不能点击需要给工作空间配置ndk目录的位置
 * window->preferences->左侧选择android->ndk 把ndk解压的目录指定进来

③ 如果写的是.c的文件 先修改一下生成的.cpp文件的扩展名 不要忘了 相应修改Android.mk文件中LOCALSRCFILES的值

④ javah生成头文件 在生成的头文件中拷贝c的函数名到.c的文件

⑤ 解决CDT插件报错的问题

右键单击项目选择 properties 选测 c/c++ general->paths and symbols->include选项卡下->点击add..->file system 选择ndk目录下 platforms文件夹 对应平台下(项目支持的最小版本) usr 目录下 arch-arm -> include 确定后 会解决代码提示和报错的问题(如果没有c/c++ general这个选项,请先运行下项目就有了)

⑥编写C函数 如果需要单独编译一下c代码就在c/c++视图中找到小锤子,如果想直接运行到模拟器上 就不用锤子了

⑦ java代码中加 system.loadlibrary();

 

猜你喜欢

转载自www.cnblogs.com/lw-blog-666/p/8978911.html