##指针和数组之间的关系
* 数组名就是数组元素的首地址
* 数组是一块连续的内存空间,每个元素之间的距离跟数据的类型有关
* 数组名字取地址,得到的还是数组的首地址
* 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. Java包的使用

    好处 1.类似于文件系统的文件夹,可以实现分类管理类文件,方便查找2.解决了同一个项目中同名类的冲突问题 包的创建 命名规范: 建议小写字母,并且采用域名倒置的写法 域名倒置:com.baidu ww ...

  2. java jdk12,安装路径没有jre文件夹

    (平台备注:win10系统,自测) 1.造成原因:JDK11之后没有直接的jre,要用户选择jre模块 2.如果需要,执行以下步骤可生成: 2.1 进入jdk安装目录下, 2.2 点击shift+右键 ...

  3. bzoj5016 & loj2254 [Snoi2017]一个简单的询问 莫队

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5016 https://loj.ac/problem/2254 题解 原式是这样的 \[ \su ...

  4. TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片

    **TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片首先我们来看看淘宝的功能和样式:** 之后看看制作完成的演示:(由于全部功能弄成GIF有点大,限制上传大小好像在1M之内,压缩之后也有1.9 ...

  5. python 小工具 重命名当前文件夹内所有的文件,升序命名

    背景:一个朋友想升序重命名他的照片,但是太多了不想手动所以,emememem os这个模块,不用说,rename,filedir等 #conding=utf8 import os path = os. ...

  6. windows openssh安装

    下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases 解压好后打开目录,执行以下命令: powershell.exe -Execution ...

  7. UVa 10054 : The Necklace 【欧拉回路】

    题目链接 题目大意:我的妹妹有一串由各种颜色组成的项链. 项链中两个连续珠子的接头处共享同一个颜色. 如上图, 第一个珠子是green+red, 那么接这个珠子的必须以red开头,如图的red+whi ...

  8. 对vueloader的研究

    vue-loader是webpack的加载器,允许您以称为单文件组件(SFC)的格式创作Vue组件: <template> <div class="example" ...

  9. Eclipse使用maven创建SSM-web项目

    1.环境准备 (1)maven:apache-maven-3.5.2,我的maven安装在D:\apache-maven-3.5.2,eclipse中maven配置如下: 先add ,添加好自己的ma ...

  10. SQL Server 中用While循环替代游标Cursor的解决方案

    在编写SQL批处理或存储过程代码的过程中,经常会碰到有些业务逻辑的处理,需要对满足条件的数据记录逐行进行处理,这个时候,大家首先想到的方案大部分是用“游标”进行处理. 举个例子,在订单管理系统中,客服 ...