交叉编译

  • 在一个平台下,编译出另一个平台能够执行的二进制的代码
  • 平台: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_itheima_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文件中添加

常见错误

  • findLibrary returned null

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

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

javah

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

javap

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

      • 打印方法签名

JNI与底层调用的更多相关文章

  1. Android JNI c/c++调用java 无需新建虚拟机

    近期通过研究SDL源码 得出android JNI  c/c++调用java 无需新建虚拟机: 具体步骤如下 第一步获得:两个参数 JNIEnv和jclass void Java_com_Test_A ...

  2. 使用JNI封装底层input系统提供的event事件

    首先说下思路,本文采用jni技术封装底层触摸事件,封装成MotionEvent类一样,不过没有android系统MotionEvent强大.源码MotionEvent位置:java-->fram ...

  3. JNI中C调用Java方法

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

  4. ndk学习17: jni之Java调用C&C++

    一.Hello World 1. 定义函数原型 native关键字定义的函数即为jni函数 2.生成头文件 切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录) javah ...

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

    转载请声明:原文转自:http://www.cnblogs.com/xiezie/p/5929996.html 一.java调用本地函数的开发步骤: 1.编写本地方法的类(可以说是用来叙述本地方法的类 ...

  6. cocos2d-x笔记5: 通过jni实现C++调用Java

    Cocos2d-x的跨平台性很强大,但是偶尔也需要平台的原生API结合. C++在Win32平台下简单的很,C++可以直接用MFC或者调用Win32API. Ios在XCode下直接就能C++和OC混 ...

  7. 【转】 Android的NDK开发(1)————Android JNI简介与调用流程

    原文网址:http://blog.csdn.net/conowen/article/details/7521340 ****************************************** ...

  8. JNI测试-java调用c算法并返回java调用处-1到20阶乘的和

    一,java端: 定义native方法, 'public native long factorial(int n);', 该方法用c/c++实现,计算'1到20阶乘的和',参数中'int n'是前n项 ...

  9. Music Studio项目心得--JNI实现C++调用JAVA

    这个项目是我參加内蒙古挑战杯的比赛项目,因为时间关系,我没时间实现OpenOMR开源项目由JAVA全然向C++的转换,经过我半个多月的尝试,我将OpenOMR中的1/3的代码改写成C++,只是非常快我 ...

随机推荐

  1. weapp-mobx

    // weapp-mobx.js const l = console.log; import { autorun } from "./mobx.umd.min"; function ...

  2. mybatis05--多条件的查询

    public interface StudentDao { /** * 前台的表单给出的查询条件不能封装成一个对象的时候 * 查询只能是多个参数了! 也就是参数不全是Student中的属性! * 这时 ...

  3. 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...

  4. 好用的Quartz管理器类

    转发的代码,原理就不提了 下面直接上代码: QuartzManager.java 动态添加.修改和删除定时任务管理类 import org.quartz.CronScheduleBuilder; im ...

  5. elementUI中table组件会出现空白部分

    先上图: 造成原因: width全部都写死了,(注释:不要全部都写死width,没写width的会自动分配宽度)  

  6. redis数据库通过dump.rdb文件恢复数据库或者数据库迁移

    环境:centos7.2软件:redis-3.2.10(yum安装) 情景一:公司之前的redis没有开启aof模式,一直是rdb模式,但是数据又非常重要,数据一点也不能丢失,所以需要开启aof,但是 ...

  7. DATEADD日期函数的使用

    在当前日期加上几天:https://www.cnblogs.com/shitaotao/p/7648198.html 计算本月的第一天:https://www.cnblogs.com/lcyuhe/p ...

  8. 记一次windows服务开发中遇到的问题

    最近在研究windows service和quartz.net,所以迅速在园子大神那里扒了一个demo,运行,安装一切顺利. 但在在App.config配置中增加了数据库连接字符串配置后,服务安装后无 ...

  9. spring 开始构造

    1,选择“org.apache.maven.archetypes:maven-archetype-webapp”骨架(模板),创建一个Web项目: 在main 目录下创建文件夹  java,  res ...

  10. RoR- Database setup& SQLite ... Migrations

    *rails uses SQLite for database by default *Built-in command-line DB viewer *Self-contained,server-l ...