码迷,mamicode.com
首页 > 其他好文 > 详细

NDK 的开发流程

时间:2016-08-02 16:32:14      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

1、NDK开发所需要的工具

windows
  需要在windows下的环境 把c代码打包成 手机能用的函数库
  首先模拟手机的环境

1 NDK
  .sh linux 批处理文件
  .bat windows

  头文件 stdio.h 编译器 interface
  库函数 连接器 class 实现类

  由于ndk有很多linux的批处理文件

  最早基于linux开发

2 工具2 cygdriver 模拟linux系统环境 (windows操作系统)
  linux系统的模拟器
  linux 把所有设备都生成了一个文件

3 cdt 为了方便在eclipse开发c代码 让c代码高亮显示
  c/c++ developer tools

4 adt
  android developer tools


交叉编译 怎么用java代码调用c代码 生成的文件存放在armeabi (表示 arme cpu anroid binary interface)目录下

 

2、具体开发步骤

  1. 定义一个c方法的接口 相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的
    1 public native String helloWorldFromC();
  2. 实现C代码
    1 //方法名 严格按照jni的规范 
    2 jstring Java_com_example_helloworldformc_MainActivity_helloWorldFromC(JNIEnv* env,jobject obj)  
  3. 生成 .mk文件  andrond.mk 告诉编译器 如何把c代码打包成函数库
    1 Anroid.mk 文件 
    2     LOCAL_PATH := $(call my-dir)   // 返回当前c代码目录
    3     include $(CLEAR_VARS)        // 清楚了所有 已local 开头的配置文件 唯独不清楚LOCAL_PATH
    4     
    5     LOCAL_MODULE    := hello   // 库函数的名字  严格遵守makefile 格式  lib  .so  如果前面加lib 不会自动生成了
    6     LOCAL_SRC_FILES := Hello.c
    7     include $(BUILD_SHARED_LIBRARY)  // 加入库函数
  4. 把c代码 打包成函数库 用到了安装的环境cygdriver
  5. 在java代码中 引入库函数,一般用静态代码块引入
    1 static{
    2 System.loadLibrary("hello");// 注意事项 去掉前面的lib 后面的.so
    3 }
  6. 使用方法
    1 String res = helloWorldFromC() ;

3、JNI常见错误

1 错误1 忘记方法的参数
2 错误2 203-28 03:41:56.758: E/AndroidRuntime(821): java.lang.UnsatisfiedLinkError: Native method not found: com.example.error.DemoActivity.helloWorld:()Ljava/lang/String;
3 错误3 一般没有日志打印 直接报错工程停止 一般c代码有运行错误
4 错误4 在交叉编译的工具链上报错 c代码有编译错误 比如 一些函数没有声明 一些类型没有声明 少符号
5 错误5 没有Android.mk 文件
6 错误6 Android.mk 文件有错 ,一般以mk开头的报错
7 错误7 引用别人.so 函数库 需要你自己native方法对应类的包名 和之前打包成.so函数库的包名一致

NDK 的开发流程

标签:

原文地址:http://www.cnblogs.com/mukekeheart/p/5729611.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!