01-JNI-基础

来源:互联网 发布:点云数据处理算法 编辑:程序博客网 时间:2024/05/29 17:47

1.交叉编译

介绍:

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

2.JNI开发工具介绍

这里写图片描述
ndk native develop kit
ndk 常用目录:
docs 帮助文档
platforms 平台, 选择项目支持的最小版本号的文件夹
include jni 开发中常用的头文件
samples gooles 官方提供的样例工程 .h文件
lib gooole打包好的 .so 文件
build/tools 批处理命令的存放位置
常用命令: ndk-build

3.JNI helloword开发

开发步骤:

1.java中

声明方法:

public native String helloFromC();

在适当位置加载库文件:

System.loadLibrary("hello");    String hello = helloFromC();    Toast.makeText(getApplicationContext(), hello, 0).show();   

2.项目根目录创建jni文件夹

  • 创建hello.c
#include <stdio.h>        #include <stdlib.h>        #include <jni.h>        jstring Java_com_uu_jnihelo_MainActivity_helloFromC(JNIEnv* env,jobject thiz){            char* cstr = "hello from c!";            return (*env)->NewStringUTF(env,cstr);        }
    参数解释:        1.  JNIEnv* env 是结构体JNINativwInterface 的二级指针            JNIEnv 是结构体JNINativeInterface的一级指针            所以使用env 调用结构体中的函数时要 采用以下方式:                    **env.函数名();                或者    *env->函数名();        2.  jobject thiz 调用本地函数的java对象,在这个例子中  就是MainActivity的实例(class 文件)        3.  c本地函数命名规则   java_包名_类名_本地方法名
  • 创建Andorid.mk

<img src="picture/Androidmk.png"/>

注意:此文件一般只需改变图中标注的内容

*创建Application.mk

APP_ABI := armeabi x86  //支持的cpu APP_PLATFORM := android-19  //最低编译版本
  • 编译c文件

    cmd下:
    E:\Android\NDK\01-JNIHelo> ndk-build
    解释:项目所在路径 编译命令

  • 自动生成函数名称命令

    cmd下:
    E:\Android\NDK\01-JNIHelo\src>javah com.uu.jnihelo.MainActivity
    解释: src 所在路径 javah 类所在相对路径

3.常见错误

  • 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

4.eclipse小技巧

<img src="picture/decodefile.png"/>

0 0
原创粉丝点击