JNI学习笔记
Posted lw-blog-666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
以上是关于JNI学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
Android JNI学习笔记-数据类型映射以及native调用java
Android JNI学习笔记-编译文件Android.mkApplication.mk 与camke