jni编译文档(Eclipse)
来源:互联网 发布:守望先锋手机数据查询 编辑:程序博客网 时间:2024/06/05 09:37
用到的概念
- 交叉编译,在一个平台上为另一个平台编译程序,不同的操作系统,window, Mac OS, Linux;不同处理器架构,X86 ARM Mips
本地编译。编译代码的平台Host,运行代码的平台Target
交叉编译工具链,一系列工具依次调用,形成链条,arm-linux-gcc
jni开发用到工具
- cdt: c/c++ development tools eclipse插件
- NDk: Native Development kit
- Cygwin : windows上提供unix模拟环境
NDK 目录结构
- build 目录下XXX.mk 指导编译配置文件
- docs 文档
- platforms 编程需要头文件,
- android-ndk-r10e\platforms\android-18\arch-arm\usr\include 头文件
- \android-ndk-r10e\platforms\android-18\arch-arm\usr\lib 库文件 .so
- prebuilt 目录下 make.exe 工程管理器,编译工程,帮我们调用工具链中工具 android-ndk-r10e\prebuilt\windows-x86_64\bin
- samples 例子目录
toolchains 工具链
ndk-build.cmd 包装好的make
jni开发流程
- 阶段1 编码
创建工程,用native 声明本方法,新建jni文件夹,添加hello.c文件
#include <jni.h>//jni要求本地方法名按格式 Java_包名(.需要换成_)_类名_方法名// JNIEnv * env 代表java环境// jobject obj 调用这个方法的类的对象jstring Java_com_itheima_hello_MainActivity_helloFromC(JNIEnv *env, jobject obj){ char *ptr = "Hello world"; // env : JNIEnv * : struct JNINativeInterface* * // (*env)->NewStringUTF() //jstring (*NewStringUTF)(JNIEnv*, const char*);//把char *转为jstring return (*env)->NewStringUTF(env, ptr);}
阶段2 编译
在jni目录下添加Android.mk指导编译
LOCAL_PATH := $(call my-dir) #指定当前目录include $(CLEAR_VARS) #清除LOCAL_XXX变量,除了LOCAL_PATHLOCAL_MODULE := hello #指定最终生成的库名hello, 库文件名libhello.soLOCAL_SRC_FILES := hello.c #指定由hello.c来生成最终的库include $(BUILD_SHARED_LIBRARY) #指定生成动态链接库 .so
把ndk-build.cmd路径添加到Path环境变量,进入jni目录下,执行ndk-build
D:\jni02\code\01_hello\jni>ndk-build[armeabi] Compile thumb : hello <= hello.c[armeabi] SharedLibrary : libhello.so[armeabi] Install : libhello.so => libs/armeabi/libhello.so
在调用类中加载.so动态库
static{ System.loadLibrary("hello");//需要是库名而不是库的文件名}
jni开发过程中常见错误
方法找不到, Native method not found: com.itheima.hello2.MainActivity.resultFromC:(II)I
- 本地方法名没有按jni要求写
- 动态库没在类中加载
库找不到,Couldn’t load resultfr0mc: findLibrary returned null
- 加载的库名写错
- 生成的库不是指定平台,arm 库在x86下运算
- 可以在jni文件夹下添加Application.mk,其中添内容APP_ABI := all,再重新编译
eclipse结合ndk工具开发jni程序
- 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.运行应用,会自行编译动态库并安装。
利用javah命令生成jni格式头文件及jni本地函数声明
- jdk1.6 在工程的bin\classes执行
0 0
- jni编译文档(Eclipse)
- Eclipse编译JNI头文件
- eclipse下编译jni的配置
- eclipse 下jni自动编译无需cygwin
- eclipse ndk编译JNI的设置
- Eclipse编译JNI的三种方法
- ubuntu 15.用ECLIPSE编译JNI
- eclipse使用外部工具快捷编译jni
- eclipse使用外部工具快捷编译jni
- 【Android】Eclipse自动编译NDK/JNI
- mac eclipse 配置ndk编译jni
- eclipse android jni 开发,so库编译
- 使用eclipse直接编译jni并且使用jni
- jni 文档
- Android Eclipse 进阶JNI开发一: NDK自动编译于eclipse自动生成jni头文件
- ubuntu下搭建eclipse + ndk编译JNI库
- 使用eclipse编译jni代码遇到的问题记录
- Eclipse环境下通过Cygwin使用NDK编译jni程序
- hdu2199 二分
- Longest Valid Parentheses
- HashMap死循环问题分析
- 快速排序C++实现
- mybatis result maps collection already contains value
- jni编译文档(Eclipse)
- Delphi 属性多参数使用
- 由多线程内存溢出产生的实战分析
- 多线程编程——互斥对象
- 错误:Undefined symbols for architecture armv7
- 分布式锁redis实现
- HDU5762 Teacher Bo 多校联赛第三场1011
- Hibernate中通过HQL/JPQL查询的方式实现动态数据获取
- hdu5755Gambler Bo