JNI(2) Android NDK 环境搭建与使用
来源:互联网 发布:informix 端口 编辑:程序博客网 时间:2024/05/16 19:54
NDK主要通过Java的Jni与C/C++交互,不会Jni的可先去看看我之前整理的<< JNI(1) Java与C/C++的交互>>
一。搭建NDK开发环境
二。如何使用NDK做开发
一。搭建NDK开发环境
1. 下载对就平台的NDK版本
下载URL:
http://developer.android.com/tools/sdk/ndk/index.html
Windows版再也无须去下载Cygwin了,直接下载NDK后解压即可。
2. NDK包含的东西
libc (C library) headers
libm (math library) headers
JNI interface headers
libz (Zlib compression) headers
liblog (Android logging) header
OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
A Minimal set of headers for C++ support
OpenSL ES native audio libraries
Android native application APIS
3. NDK下值得花点时间看一看的东西
a. 文档Android NDK Overview
即NDK目录下的OVERVIEW.html
里面关于如何使用NDK做开发说得很清楚.
b. samples 目录下的代码例子.
二。如何使用NDK做开发
官网的Getting Started with the NDK
Place your native sources under <project>/jni/...Create <project>/jni/Android.mk to describe your native sources to the NDK build systemOptional: Create <project>/jni/Application.mk.Build your native code by running the 'ndk-build' script from your project's directory. It is located in the top-level NDK directory:cd <project><ndk>/ndk-buildThe build tools copy the stripped, shared libraries needed by your application to the proper location in the application's project directory.Finally, compile your application using the SDK tools in the usual way. The SDK build tools will package the shared libraries in the application's deployable .apk file.
依NDK中的Hello-jni做的例子
1. 使用Jni的Android类文件
package com.xcl.jnidemo5;/** * 演示NDK开发 * * author:xcl * date:2014-3-20 */import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(R.layout.activity_main); TextView tv = new TextView(this); tv.setText(stringFromJNI() ); setContentView(tv);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public native String stringFromJNI();static { System.out.println(System.getProperty("java.library.path")); System.loadLibrary("jnicplus5"); }}2. 与Jni相关的处理
2.1 依上面的Java类生成相关的.h文件
目的是为要生成c文件创建出函数原型,虽然NDK中用不上.h文件,但最好还是用javah来生成原型,否则一不小心没写标准,就会出现java.lang.UnsatisfiedLinkError:Native method not found 类错误。
D:\AppWork\XExample\workspace\jnidemo5\src>javah com.xcl.jnidemo5.MainActivityD:\AppWork\XExample\workspace\jnidemo5\src>dir 驱动器 D 中的卷是 Data 卷的序列号是 0EC2-012C D:\AppWork\XExample\workspace\jnidemo5\src 的目录2014/03/29 21:23 <DIR> .2014/03/29 21:23 <DIR> ..2014/03/29 21:19 <DIR> com2014/03/29 21:23 529 com_xcl_jnidemo5_MainActivity.h 1 个文件 529 字节 3 个目录 18,683,146,240 可用字节
2.2. 新建存放jni的目录
在Eclipse Android工程中按右键,选 Source Folder,新建jni目录.
2.3 新建对应.h文件的c文件 jnicplus5.c
/** * 演示NDK开发 * JNI的C实现 * author:xcl * date:2014-3-20 */#include <string.h>#include <jni.h>/* * Class: com_xcl_jnidemo5_MainActivity * Method: stringFromJNI * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_xcl_jnidemo5_MainActivity_stringFromJNI (JNIEnv * env, jobject jobj){ return (*env)->NewStringUTF(env, "Hello from JNI !");}
2.4 生成编译文件
Android.mk :
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := jnicplus5LOCAL_SRC_FILES := jnicplus5.cinclude $(BUILD_SHARED_LIBRARY)
Android.mk中的LOCAL_MODULE指定了要生成的动态库名称,要与Java代码中指定的要一致。
LOCAL_SRC_FILES 则只要指定Java文件用到的native函数的实现的那个c文件即可,其它文件NDK编译时会自动推导出来。
LOCAL_PATH 是从工程目录中找源文件的意思。
其它的参数好理解 ,就相于是个手写的Makefile文件。只不过.mk有些自定义好的宏定义而已。
Application.mk
APP_ABI := all
其中Application.mk用于指定要交叉编译生成哪些平台的.so文件。
2.5 将.c文件编译成动态库
NDK编译出动态库很简单,转到Android工程jni目录下,调用一下NDK下的 ndk-build 即可。
D:\AppWork\XExample\workspace\jnidemo5\jni>C:\Ndk\ndk\ndk-build[armeabi-v7a] Compile thumb : jnicplus5 <= jnicplus5.c[armeabi-v7a] SharedLibrary : libjnicplus5.so[armeabi-v7a] Install : libjnicplus5.so => libs/armeabi-v7a/libjnicplus5.so[armeabi] Compile thumb : jnicplus5 <= jnicplus5.c[armeabi] SharedLibrary : libjnicplus5.so[armeabi] Install : libjnicplus5.so => libs/armeabi/libjnicplus5.so[x86] Compile : jnicplus5 <= jnicplus5.c[x86] SharedLibrary : libjnicplus5.so[x86] Install : libjnicplus5.so => libs/x86/libjnicplus5.so[mips] Compile : jnicplus5 <= jnicplus5.c[mips] SharedLibrary : libjnicplus5.so[mips] Install : libjnicplus5.so => libs/mips/libjnicplus5.so
如果把Application.mk 内容定义为APP_ABI := armeabi 则只生成arm的动态库
D:\AppWork\XExample\workspace\jnidemo5\jni>C:\Ndk\ndk\ndk-build[armeabi] Compile thumb : jnicplus5 <= jnicplus5.c[armeabi] SharedLibrary : libjnicplus5.so[armeabi] Install : libjnicplus5.so => libs/armeabi/libjnicplus5.so
3. 运行整个Android工程即可得到想要的结果了.
MAIL: xcl_168@aliyun.com
BLOG: http://blog.csdn.net/xcl168
0 0
- JNI(2) Android NDK 环境搭建与使用
- android ndk jni 环境搭建
- android如何使用自定义JNI接口,以及NDK工具的环境搭建与使用。
- Android Studio 下的NDK环境搭建与JNI调用
- Android—NDK环境搭建及JNI使用详解
- Android-JNI(2)-NDK环境搭建和简单案例
- Android NDK&&JNI 编译环境的搭建
- Android NDK+JNI开发环境搭建
- Android NDK&&JNI 编译环境的搭建
- Android jni开发资料--NDK环境搭建
- 初识JNI之-Android Ndk环境搭建
- Android初识JNI-搭建NDK开发环境
- Android jni开发资料--NDK环境搭建
- Android jni开发资料--NDK环境搭建
- Android jni开发--NDK环境搭建
- Android jni开发资料--NDK环境搭建
- Android jni开发资料--NDK环境搭建
- Android jni开发资料--NDK环境搭建
- X11 系统架构原理
- android学习笔记(十二)日期、时间组件
- zoj 3717 二分+2sat tarjan求强连通
- Fedora和Ubuntu指令差别(待补充)
- extjs 定义类
- JNI(2) Android NDK 环境搭建与使用
- javascript使用RSA加密提交数据
- C#-控制台-希尔排序法---ShinePans
- Openstack Glance Image状态迁移-Havana
- make Image uImage与zImage的区别
- 输入/输出流体系
- 我的vim配置笔记
- 黑马程序员--银行调度系统
- hdu 1698 Just a Hook 线段树 成段更新