##指针和数组之间的关系
* 数组名就是数组元素的首地址
* 数组是一块连续的内存空间,每个元素之间的距离跟数据的类型有关
* 数组名字取地址,得到的还是数组的首地址
* arr[i]  ==  *(arr+i)
##指针的运算
            只能计算连续的内存空间
##动态内存和静态内存
* 动态内存 
- new 对象这就是动态申请内存
* 静态内存
- 方法体 int i; 静态内存
##结构体
*跟java里面的class非常类似
*编译器,把结构体进行一个对齐操作。 提高内存寻址的效率
##联合体
*联合体中只能存储一种数据类型的数据
*如果有多个数据类型,那么联合体的长度是联合体中最长类型的长度
##宏定义
*就是定义别名,关键字是type of
#JNI开发的流程
规范,中间人,中间件 c/c++ <---> java
NDK: native develop kits 谷歌给安卓程序员提供的一个做jni开发的工具
##NDK开发工具的目录结构
- doc 开发帮助文档
- build c语言编译的工具链 cygwin 
- platform 平台: 指定了编译针对的Android平台
- arm  处理器架构  手机平板电脑 三星 摩托 
- mips 处理器架构  开源的处理器架构(龙芯)
- x86  处理器架构  台式机 笔记本(intel,AMD)
>交叉编译: 使用交叉编译工具链在一个平台下编译出来另外一个平台可以运行的二进制代码
>c词法分析 语法分析 编译原理
- prebuild 预编译工具目录
.java -->.class --->jvm -->解释执行(java翻译机器语言)
.c --> .o --->根据机器类型链接 -->机器代码
- sample 示例代码
- source 工具链的源码
- tool chains 工具链
- ndk-build.cmd 编译c代码的工具脚本
## 开发流程
* JAVA程序员 搞Android开发
* c程序员 搞c开发,实现业务功能(例如用c实现一个加密算法)
* JNI工程师(胶水)
- 定义java的接口
- 定义c的接口
##cdt Eclipse的插件
c/c++ develop tools,可以让c/c++的语法高亮显示。
编译c代码。ndk交叉编译的工具链。
##JNI开发的流程
1. 现在java代码里面声明一个native的方法
  public native String helloFromC();
2. 在Eclipse的工程目录下创建一个文件夹 名称jni
3. 编写c代码,按照规范编写
jstring Java_com_itheima_hellojni_MainActivity_helloFromC(JNIEnv* env,jobject obj){
char* str = "hello from c !!";
//在jni规范里面 在jni环境的结构体里面
//jstring     (*NewStringUTF)(JNIEnv*, const char*);
//转化成了java的字符串
return (*(*env)).NewStringUTF(env,str);
}
Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)
4. ndk-build.cmd指令编译c代码
5. 配置Android.mk文件
#指定编译的文件夹  指定当前文件目录
LOCAL_PATH := $(call my-dir)
#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。
include $(CLEAR_VARS)
#编译出来模块的名称
LOCAL_MODULE    := hello
# 编译的源代码的名称
LOCAL_SRC_FILES := hello.c
 
#编译一个动态库,静态库
#静态库 文件名.a   包含所有的函数并且函数运行的依赖,体积大,包含所有的API
#动态库 文件名.so  包含函数,不包含函数运行的依赖,体积小,运行的时候,去操作系统寻找需要的API
include $(BUILD_SHARED_LIBRARY)
6. 生成一个.so的动态链接库
7. 在java代码里面,把动态链接库加载到jvm虚拟机
static{
System.loadLibrary("库文件名称不带前缀,后缀名");
}
8. 像调用一般java代码一样调用native的方法
##JNI应用场景
银行手机客户端应用。钱。
JAVA 非常容易反编译。
 
* c代码已经写好了()
* java代码和c代码同时开工
##JNI开发的常见错误
1. 写错了load的library 
java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null
 
2. Android.mk文件编写错误
/jni/Android.mk:4: *** missing separator.  Stop.
 
3. LOCAL_MODULE配置不能有扩展名
//jni/Android.mk:hello.so: LOCAL_MODULE_FILENAME must not contain a file extension
4. c或者c++的源文件名称配置错误
objs/hello/helo.o'.  Stop.
5. 如果使用了错误的cpu平台
java.lang.UnsatisfiedLinkError: Couldn't load hello: findLibrary returned null
添加多cpu平台的支持 APP_ABI := armeabi armeabi-v7a x86
6. c语言方法名称错误,导致java代码无法寻找到c代码
Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;
7. 应用程序闪退
06-25 07:31:46.698: I/dalvikvm(1871):   #00  pc 0008ee6d  /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871):   #01  pc 000738ca  /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871):   #02  pc 000739f4  /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871):   #03  pc 00038f5b  /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871):   #04  pc 0003bdbd  /system/lib/libdvm.so
要么就是c代码有逻辑错误
要么编码问题,中文或者空格路径
##KISS
Keep it simple stupid

安卓中如何调用jni的更多相关文章

  1. 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10

    关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...

  2. 图解-安卓中调用OpenGL

    游戏开发中经常使用到OpenGL,当然很多人都喜欢直接用现有的游戏引擎,但相信了解的更多对你没有坏处 安卓开发中,采用的OpenGL ex2的规范,前几天看了下这个规范,整体上难度比1.0规范难度加大 ...

  3. Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码

    以前写过两个Android开发配置文档,使用NDK进行JNI开发,这样能够利用以前已经写好的C++代码. 前两篇博客地址: http://blog.csdn.net/watkinsong/articl ...

  4. JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

  5. 【转】Eclipse中一键调用javah生成jni的头文件

    这里定义了一个本地方法jni_test,该方法返回一个String.其中System.loadLibrary是用来加载本地库的(dll或者so). 有了这个类以后,就可以调用javac命令编译,得到E ...

  6. Android JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码.实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用. JNI关键方法讲解. 1. 在同一个类中,调用其他方法 JNIEXPORT v ...

  7. angularjs中安卓原生APP调用H5页面js函数,js写法应注意

    安卓原生app调用js方法,js方法应写在html下的script标签内,不能有任何function包裹,例如angular的controller层,这样APP也是获取不到的: 所以只有放在html中 ...

  8. [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法

    原文地址:http://blog.csdn.net/watkinsong/article/details/9849973 有一种方式不需要自己配置所有的Sun JDK, Android SDK以及ND ...

  9. 安卓中的Model-View-Presenter模式介绍

    转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0425/2782.html 英文原文:Introduction to M ...

随机推荐

  1. 不用找了,基于 Redis 的分布式锁实战来了!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 作者:菜蚜 my.oschina.net/wnjustdoit/blog/1606215 前言:在分布式环境中,我们经常使用 ...

  2. require 和 import 详解

    前言 JS模块化编程是前端小伙伴们必不可少的知识,下面妹子将于自认为比较清晰的方式列举出来. 1 require 特点: 1.运行时加载 2.拷贝到本页面 3.全部引入 1.1 CommonJS No ...

  3. React.memo

    介绍React.memo之前,先了解一下React.Component和React.PureComponent. React.Component React.Component是基于ES6 class ...

  4. C++ CMake 入门实战[转载]

    C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...

  5. 团队中的 Git 实践

    转载自:https://segmentfault.com/a/1190000004963641 本文首发于欧雷流.由于我会时不时对文章进行补充.修正和润色,为了保证所看到的是最新版本,请阅读原文. 在 ...

  6. Centos 7 环境下安装 RabbitMQ 3.6.10

    一.单机安装 在Centos7系统下部署(阿里云服务),使用yum安装 hostnamectl set-hostname rabbit01 #永久修改 1.1安装Erlang,因为RabbitMQ 是 ...

  7. 三、ARM 寄存器及异常处理

    3.1 ARM 内部寄存器 ARM920T 总共有 37 个寄存器,其中 31 通用 32 位寄存器和 6 个状态寄存器,但不能在同一时刻对所有的寄存器可见.处理器状态和运行模式决定了哪些寄存器对程序 ...

  8. 测试tensorflowgpu版本是否可用

    输入一下代码即可 import tensorflow as tf print(tf.test.is_gpu_available())

  9. kettle 通过JDBC 连接SQL Server(Error occurred while trying to connect to the database)

    在连接数据(MS SQLServer 2008)发现:Error occurred while trying to connect to the database 然后找资料看,都不是问题所在,最后一 ...

  10. 什么是Js原型?(1)(包括作用:继承)

    学习目标:    认识什么js是原型,原型.构成函数.实例对象关系:原型应用范围. 什么是原型    函数有原型,函数有一个属性叫prototype,函数的这个原型指向一个对象,这个对象叫原型对象.这 ...