转载请注明出处:http://www.cnblogs.com/fpzeng/p/4281801.html

源码请见 https://github.com/fpzeng/HelloJNI

PC系统: ubuntu 12.04

Android SDK: android-sdk-linux_r24

Android NDK:android-ndk-r10d

概述

在android上使用ndk的步骤:

  1. 创建java文件,声明native方法;
  2. 使用javah生成C语言接受的头文件*.h;
  3. 创建*.c文件,使用C语言实现该native方法;
  4. 编译*.c文件产生so库
  5. 运行的时候,java使用System.loadLibrary打开so库,调用native方法。

声明native方法

在com.fpzeng.example.jni.HellojniActivity声明native方法:

private native String nativeGetMacAddress(int Parameter1);

此时目录结构如下: 

AndroidManifest.xml
-jni
Android.mk
-src
   hello_jni.c
-src
  -com
  -fpzeng
  -example
  -jni
  HellojniActivity.java
-res ...

产生头文件

使用javah产生jni头文件,会将产生的头文件com_fpzeng_example_jni_HellojniActivity.h输出到jni目录下。命令如下:

javah -jni -d jni -classpath src/ com.fpzeng.example.jni.HellojniActivity

产生的 com_fpzeng_example_jni_HellojniActivity.h头文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_fpzeng_example_jni_HellojniActivity */ #ifndef _Included_com_fpzeng_example_jni_HellojniActivity
#define _Included_com_fpzeng_example_jni_HellojniActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_fpzeng_example_jni_HellojniActivity
* Method: nativeGetMacAddress
* Signature: (I)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_fpzeng_example_jni_HellojniActivity_nativeGetMacAddress
(JNIEnv *, jobject, jint); #ifdef __cplusplus
}
#endif
#endif

此时的入参数是int,返回值类型时String类型。  

引入Android SDK

如果将java中声明的native方法变的复杂,比如引入Context。在com.fpzeng.example.jni.HellojniActivity声明native方法更新为

private native String nativeGetMacAddress(Context context);

  运行产生命令: javah -jni -d jni -classpath src/ com.fpzeng.example.jni.HellojniActivity,此时提示错误:

Error: Cannot determine signature for Context

这是由于javah不认识Context类,需要将android.jar包含进来才行。

我的LINUX环境变量中,使用ANDROID_SDK_ROOT指向了当前android-sdk-linux_r24的绝对路径,大家也需要设置自己的ANDROID SDK环境变量。此时,头文件的生成命令如下:

javah -jni -d jni -classpath src/:$ANDROID_SDK_ROOT/platforms/android-15/android.jar com.fpzeng.example.jni.HellojniActivity

产生的 com_fpzeng_example_jni_HellojniActivity.h头文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_fpzeng_example_jni_HellojniActivity */ #ifndef _Included_com_fpzeng_example_jni_HellojniActivity
#define _Included_com_fpzeng_example_jni_HellojniActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_fpzeng_example_jni_HellojniActivity
* Method: nativeGetMacAddress
* Signature: (Landroid/content/Context;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_fpzeng_example_jni_HellojniActivity_nativeGetMacAddress
(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif

加入Android.mk  

每次新加native方法都需要运行该命令,是不是很头痛?

首先在jni/Application.mk中指定当前的工程路径,用变量APP_PROJECT_PATH指向。

APP_PROJECT_PATH := $(shell pwd)
APP_CFLAGS+=-Wno-error=format-security
APP_PLATFORM := android-15
APP_ABI := armeabi-v7a
APP_OPTIM := debug

然后在jni/Android.mk 加入响应的参数依赖,如下:

headers:
$(warning app project path $(APP_PROJECT_PATH))
@cd $(APP_PROJECT_PATH)
javah -jni -d jni -classpath src/:$ANDROID_SDK_ROOT/platforms/android-15/android.jar com.fpzeng.example.jni.HellojniActivity

此时运行ndk-build headers,首先打印 aap project path目录,然后进入该目录执行javah命令。

最新文章

  1. CSS中margin与padding的区别
  2. 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块
  3. 让C#开发更简单,抽象增删改
  4. springmvc的mvc:view-controller标签
  5. 教你50招提升ASP.NET性能(十四):使用startMode属性来减少ASP.NET站点加载时间
  6. bzoj 1925 [Sdoi2010]地精部落(DP)
  7. XMLHttpRequest对象的使用
  8. java面向对象理解
  9. 如何在 window7 环境编译 zlib 库?
  10. Python基本数据结构--列表
  11. SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系
  12. [Poi2012]A Horrible Poem BZOJ2795
  13. 在VS2010上安装MVC4(webApi)
  14. C++ 中 const、volatile、mutable的用法
  15. ELK(elasticsearch+kibana+logstash)搜索引擎(一): 环境搭建
  16. stm32之TIM+ADC+DMA采集50HZ交流信号
  17. 八:python 对象类型详解四:字典
  18. crontab命令使用文档.txt
  19. 7行代码看EntityFramework是如何运行
  20. Differences between write through and write back

热门文章

  1. App项目升级Xcode7&amp;iOS9(续) - This bundle is invalid. The bundle identifier contains disallowed characters
  2. U8800安装软件显示无效的URI问题
  3. Delphi Dcp 和BPL的解释
  4. HDOJ 1266 Reverse Number(数字反向输出题)
  5. linux内核链表的移植与使用
  6. 转自http://blog.sina.com.cn/daylive——C++ STL set&amp;multiset
  7. HDU_1239——再次调用外星智慧
  8. 用 O(1) 时间检测整数 n 是否是 2 的幂次。
  9. Java中快速排序的实现
  10. hdu-1598