android中的jni开发(简版)

来源:互联网 发布:淘宝网尼大衣 编辑:程序博客网 时间:2024/05/01 11:30


//动态库的加载
static{
System.loadLibrary("hello");//动态库名不是动态库文件名
}
//native声明本地方法
   public native String 本地方法名(参数...);

   本地方法调用(参数);








1.在jni文件夹新建 Android.mk文件,指导编译本地源文件


   LOCAL_PATH := $(call my-dir)#指定当前目录

   include $(CLEAR_VARS)#清除LOCAL_XXX 编译用到变量,除了LOCAL_PATH

   LOCAL_MODULE    := hello#指定生成模块名,动态库名hello,生成动态库文件libhello.so
   LOCAL_SRC_FILES := hello.c#指定生成最终模块用到的所有源文件

   include $(BUILD_SHARED_LIBRARY)#指针定成目标类型动态库


* 2.把ndk-build.cmd路径添加path环境变量
* 3.进入jni文件夹下执行ndk-build


D:\jni02\code\01_HelloFromC\jni>ndk-build 
[armeabi] Compile thumb  : hello <= hello.c
[armeabi] SharedLibrary  : libhello.so
[armeabi] Install        : libhello.so => libs/armeabi/libhello.so


* 4.在调用本地方法的类中加载动态库


static{
System.loadLibrary("hello");//动态库名不是动态库文件名
}


## jni开发常见的错误及解决 ##
* 找不到库 Caused by: java.lang.UnsatisfiedLinkError: Couldn't load calc-jn1: findLibrary returned null


* 加载库名与实际库名不一致,检查加载库名
* 生成库与运行平台的cpu架构不一致,解决办法在jni文件夹下添加Application.mk文件其中加上APP_ABI := all,编译生成所有支持的平台对应的库


* 找不到方法 java.lang.UnsatisfiedLinkError: Native method not found: com.seaker.resultfromc.MainActivity.resultFromC:(II)I


* 本地函数名不符合jni规范
* 没有加载本地库


## javah命令生成jni样式头文件 ##
* jdk1.6 在工程bin/classes 和com 同层目录
* jdk1.7 在工程src 和com 同层目录


\src>javah com.seaker.resultfromc.MainActivity
生成Header for class com_seaker_resultfromc_MainActivity






## 结合eclispe和NDK开发 ##
* 1.新建工程,声明本地方法,调用本地方法
* 2.工程中指定NDK路径,见add ndk location2.gif
* 3.工程中右键Andoird Tools --> Add Native Support 可以自动添加jni文件夹及.cpp源文件和Android.mk,需要修改源文件为.c文件,在Android.mk文件中也要修改 见add native support.gif
* 4.在.c源文件中添加jni.h头文件路径,见include jni head file.gif
* 5.在.c源文件中实现本地方法,利用javah生成本地函数名
* 6.在类加载动态库
* 7.运行应用,会自行编译动态库并安装。
0 0