JNI

  java native interface

c的基本数据类型

  • int:32位,能表示的数字是2的32次方个
  • 最高位用来表示符号位,那么还剩下31位可以表示数值,所以能表示的数字就是2的31次方个
  • int的表示范围:
    • 当最高位是0时:0~2147483647
    • 当最高位是1是:-2147483648~-1

      java的基本数据类型长度

      c的基本数据类型长度

      • byte:1
      • short:2
      • int:4
      • long:8
      • boolean:1
      • char:2
      • float:4
      • double:8
      • short:2
      • int:4
      • long:4
      • char:1
      • float:4
      • double:8

*的三种用法

  1. 乘法
  2. int* p: 定义一个指针变量p,p中存放一个内存地址,这个地址所存放的数据规定是int型
  3. *p:  取出p中保存的内存地址存放的数据

数据传递

  • 所有语言所有平台,都只有值传递,引用传递 传递的值是内存地址

  • 系统自动分配和释放
  • 保存全局、静态、局部变量
  • 在栈上分配内存叫静态分配
  • 大小一般是固定的

  • 程序员手动分配(malloc/new)和释放(free/java不用手动释放)
  • 在堆上分配内存叫动态分配
  • 一般硬件内存有多大就有多大

交叉编译

  • 在一个平台下,编译出另一个平台能够执行的二进制的代码
  • 平台:windows,mac os,linux
  • 处理器:x86,arm,mips

交叉编译的原理

  • 源代码->编译->链接->可执行程序
  • 模拟其他平台的特性

交叉编译的工具链

  • 多个工具的集合,一个工具使用完后接着调用下一个工具

常见工具

  • NDK:native developement kit:开发jni必备,就是模拟其他平台特性来编译代码的工具
  • CDT:C/C++ developement tools:高亮显示c语言关键字
  • cygwin:一个模拟器,可以再windows下运行linux指令

NDK目录结构

  • docs:帮助文档
  • build/tools:linux的批处理文件
  • platforms:编译c代码需要使用的头文件和类库
  • prebuilt:预编译使用的二进制可执行文件
  • sample:jni的使用例子
  • source:ndk的源码
  • toolchains:工具链
  • ndk-build.cmd:编译打包c代码的一个指令

使用jni

  1. 在项目根目录下创建jni文件夹
  2. 在jni文件中创建一个c文件
  3. 在java代码中,创建一个本地方法helloFromC

    public native String helloFromC();
  4. 在jni中定义函数实现这个方法,函数名必须为

    jstring Java_com_example_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)
  5. 返回一个字符串,用c定义一个字符串

    char* cstr = "hello from c";
  6. 把c的字符串转换成java的字符串

    jstring jstr = (*env)->NewStringUTF(env, cstr);
    return jstr;
  7. 在jni中创建Android.mk文件
  8. 在c文件中添加<jni.h>头文件
  9. 在jni文件夹下执行ndk-build.cmd指令
  10. java代码中加载so类库,调用本地方法

常见错误

  • findLibrary returned null

    • CPU平台不匹配
    • 加载类库时,写错类库名字
  • 本地方法找不到

    • 忘记加载类库
    • c代码中方法名写错了

javah

*1.7:在src目录下执行javah 包名.类名 *1.6:在bin/classes目录下执行

javap

  • 在bin/class目录下执行javap -s 包名.类名

    • 打印方法签名

C向C++改造

  1. 把c文件后缀名换成cpp
  2. Android.mk文件中的hello.c也要换成hello.cpp
  3. c++的使用的环境变量结构体中,访问了c使用的结构体的函数指针,函数名全部都是一样的,只是参数去掉了结构体指针
  4. 访问函数指针时,把env前面的*号去掉,因为此时env已经是一级指针
  5. clean,清除之前编译的残留文件
  6. 把声明函数的h文件放入jni文件夹中,include该h文件

Android——C语言、JNI与低层调用的更多相关文章

  1. Android项目中JNI技术生成并调用.so动态库实现详解

    生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...

  2. Android JNI之C/C++层调用JAVA

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5930032.html 从C/C++层调用JAVA层代码步骤: 1. 在JAVA类中创建java方法和本地方法 ...

  3. Android JNI开发之C/C++层调用JAVA

    一.从C/C++层调用JAVA层代码(无参数调用) //在c代码里面调用java代码里面的方法 // java 反射 // 1 . 找到java代码的 class文件 // jclass (*Find ...

  4. android JNI的.so库调用

    在一篇博客中看到一篇文章,感觉描述的还可以: 在前面的博客中介绍的都是使用java开发Android应用,这篇博客将介绍java通过使用jni调用c语言做开发 为了更加形象的介绍jni,先观察下面的图 ...

  5. Android中关于JNI 的学习(三)在JNI层訪问Java端对象

    前面两篇文章简介了JNI层跟Java层的一些相应关系,包含方法名,数据类型和方法名称等,相信在理论层面.可以非常好地帮助我们去了解JNI在Native本地开发中的作用,对JNI的一些概念也有了一个初步 ...

  6. JNI学习笔记_Java调用C —— 非Android中使用的方法

    一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...

  7. (转)java 层调用Jni(Ndk) 持久化c c++ 对象

    对于Jni(Ndk) 很多人应该都有印象,Android的ndk接触到的机会相对会比较多,本例子以android平台为例,pc端的话就以简单的windows为例, 编码完用vs 或是 gcc进行编译成 ...

  8. android开发源代码分析--多个activity调用多个jni库的方法

    android开发源代码分析--多个activity调用多个jni库的方法 有时候,我们在开发android项目时会遇到须要调用多个native c/jni库文件,下面是本人以前实现过的方法,假设有知 ...

  9. Android NDK学习(四):C/C++层调用JAVA

    一.从C/C++层调用JAVA层代码(无参数调用) //在c代码里面调用java代码里面的方法 // java 反射 // 1 . 找到java代码的 class文件 // jclass (*Find ...

随机推荐

  1. CI的面向切面的普通权限验证

    第一步:开启CI的钩子配置,此次不多说看CI手册即可. 第二步:在cofig/hooks.php中进行钩子配置,CI手册中有记载 <?php defined('BASEPATH') OR exi ...

  2. 新浪微博登录接口(PHP版)

    CI框架下 新浪微博登录接口完整版说明:本贴只适合CI框架.功能实现:登录接口跳转链接成功,获取用户信息(包括最重要的u_id)成功,将用户与本地平台连接起来,用户登录成功后信息的存储,本地数据库第三 ...

  3. [转]jquery.timer用法

    转自:http://www.cnblogs.com/guohui/archive/2012/02/24/2366668.html 来自JavaEye论坛的JQuery Timers应用知识 jQuer ...

  4. jquery直接获取html页面元素

    大家都会用$('div')来获取div并对其进行一些操作,今天用到一个函数发现$('div')与getElementBy系列函数得到的对象并不一样. 然后去查了下,发现$('div')得到的是一个数组 ...

  5. 聊聊Web App、Hybrid App与Native App的设计差异

    目前主流应用程序大体分为三类:Web App.Hybrid App. Native App. 一.Web App.Hybrid App.Native App 纵向对比 首先,我们来看看什么是 Web ...

  6. Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法

    本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...

  7. Web负载均衡的几种方式

    Web负载均衡的几种实现方式 摘要:负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用 ...

  8. iOS开发之自定义画板

    今天整好有时间, 写了一个自定义的画板!  [我的github] GLPaint主要采用QuartzCore框架, 对画布上的元素进行渲染, 然后通过UIImageWriteToSavedPhotos ...

  9. iOS 图片填充 UIImageView

    UIViewContentModeScaleAspectFit,     //这个图片都会在view里面显示,并且比例不变  这就是说 如果图片和view的比例不一样 就会有留白如下图1 UIView ...

  10. js经验1

    1. input 获得焦点  focus(); 2.获得文档的的title _title = document.title; 3.定时检查删除dom定时器 var deleteDomInterval ...