Android ndk第一步,构建jni headers
转载请注明出处: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的步骤:
- 创建java文件,声明native方法;
- 使用javah生成C语言接受的头文件*.h;
- 创建*.c文件,使用C语言实现该native方法;
- 编译*.c文件产生so库
- 运行的时候,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命令。
Android ndk第一步,构建jni headers的更多相关文章
- JDK 安装与环境配置配置——Android开发第一步
什么是JDK? JDK 即 Java Development Kit,Java开发工具包,用来编译 Java 程序.JRE 在接触JDK的过程中,同时了解到 JRE,JRE 即 Java Runtim ...
- NDK plugin来构建JNI项目(相对于手动构建)
http://blog.csdn.net/codezjx/article/details/8879670 1.添加ndk环境支持 Android Tools -> Add Native Supp ...
- Android NDK(一) ndk-build构建工具进行NDK开发
本文目录 一.androidstudio环境 二.快捷键配置 三.新建项目 四.NDK开发 五.so文件编译 一. androidstudio的环境 在SDK Tools中安装NDK开发环境(File ...
- Android NDK(二) CMake构建工具进行NDK开发
本文目录 一Androidstudio中需要的插件 二项目配置 ①build.gardle配置 ②CMakeLists.txt ③Android和Cpp的代码 ④so文件生成 ⑤so文件的位置 一.A ...
- android 学习第一步
今天是2015年7月24号,今年下半年的主要学习方向是android,学习的目标是做出3个或以上的有实用价值的app.
- [原]Android 开发第一步
使用 android-studio 开发 写文章时的最新 Android-Studio 程序下载:https://dl.google.com/dl/android/studio/ide-zips/3. ...
- android ndk之hello world
前言:Android NDK r7及以上的版本已经集成了Cygwin编译环境,也就是说,我们完全可以抛弃庞大的Cygwin了. r6及以下版本,也可以抛弃几个G的完整版,使用精简过的Mini-Cygw ...
- Android NDK编程浅入深出之--Android.mk
Android.mk Android.mk是一个向Android NDK构建系统描写叙述NDK项目的GUN Makefile片段.它是每个NDK项目的必备组件. 构建系统希望它出如今jni子文 ...
- Docker多步构建更小的Java镜像
译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...
随机推荐
- New ipad安装Perl支持安装nikto
Title:New ipad安装Perl支持安装nikto --2012-11-15 09:47 New Ipad 越了后. ssh new ipad 进入目录 cd /tmp 下载Key文件 wge ...
- hosting company 的 mail , localhost send 不到
不是每一家 hosting 的 mail 都运行你在本地连接发email的. 或许是因为安全的顾虑吧. 总之下次如果发现在本地发不出email,可以试试看 upload to server. 过往经验 ...
- ALTIUM 10 过孔设置开窗、不开窗
大家或许会发现我们公司做的PCB板子,所有的过孔都开了窗,也就是说过孔没有绿油,这样会导致焊接中容易连焊.兴许大家为此吃进苦头,我是被整了好几次,查了好久却发现是个低级错误,一个过孔连焊到隔壁焊盘了. ...
- 实用C51编程的高级技巧(C51编程)
一.C51热启动代码的编制 void main() { char data *HotPoint=(char *)0x7f; if((*HotPoint==0xaa)&&(*(--Hot ...
- Qt中 QString 和int, char等的“相互”转换,关键是QString.toLocal8Bit().data();
Qt中 int ,float ,double转换为QString 有两种方法 1.使用 QString::number(); 如: long a = 63; QString s = QString:: ...
- json与jsonp ajax
今天在网上找了一下资料,发现这篇文章总结得好,果断转了:http://blog.csdn.net/superhosts/article/details/9057301
- Android把图片保存到SQLite中
1.bitmap保存到SQLite 中 数据格式:Blob db.execSQL("Create table " + TABLE_NAME + "( _id INTEGE ...
- HDU_2034——集合A-B
Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法 ...
- [LeetCode] 160. Intersection of Two Linked Lists 解题思路
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- Java Hibernate 之 Session 状态
Session接口是Hibernate向程序提供操纵数据库的最主要接口,是单线程对象,它提供了基本的保存.更新.删除和查询方法.它有一个缓存,保存了持久化对象,当清理缓存时,按照这些持久化对象同步更新 ...