android ndk jni 实例1

1、检查所需文件是否齐全

使用第三方动态库,应该至少有 2 个文件,一个是动态库(.so),另一个是包含

动态库 API 声明的头文件(.h) 

例:

Add.c(实际上如果使用第三方库时我们是没有源码的,这里为了方便举例): 

#include<stdio.h> 

int Add(int x, int y) 

 }

return x+y; 

 {

Add.h: 

#ifndef _ADD_H_ 

#define _ADD_H_ 

int Add(int x, int y); 

#endif 

使用如下 Makefile(其中红色路径需要按环境修改):

ANDROID_PATH =/home/rock/SV8860_SDK_v0.92/Source/skydroid1.6 

TOOLCHAIN_PATH = 

$(ANDROID_PATH)/platform/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin 

CFLAGS = 

-I$(ANDROID_PATH)/platform/development/ndk/build/platforms/android-4/arch-ar

m/usr/include 

LDFLAGS = 

-L$(ANDROID_PATH)/platform/development/ndk/build/platforms/android-4/arch-ar

m/usr/lib 

CC = $(TOOLCHAIN_PATH)/arm-eabi-gcc 

LD = $(TOOLCHAIN_PATH)/arm-eabi-ld 

all: 

          
   $(CC) -O2-fPIC -c $(CFLAGS) $(LDFLAGS) Add.c -olibadd.o 

          
   $(LD) -olibadd.so libadd.o -shared  

clean: 

          
   rm -rflibadd.o 

          
   rm -rflibadd.so 编译成动态库 libadd.so,用来模拟第三方动态库

2、封装原动态库

原动态库文件不包含 jni 接口需要的信息,所以我们需要对其进行封装,所以我

们的需求是:将 libadd.so 里面的 API 封装成带 jni 接口的动态库 libaddjni.so,步

骤如下:

A) 新建一个 Android 工程:com.android.libjni,其默认生成的 APK 运行结果是:

B) 在这个工程中新建一个 java 类,其中包含封装后的 API 函数,生成 jni 格式

的头文件(.h)

LibJavaHeader.java:

package com.android.libjni; 

public class LibJavaHeader { 

   public native int Add(intx, int y); 

 {

在命令行中进入该工程的 src 目录

运行如下命令

> javaccom\android\libjni\LibJavaHeader.java

> javah com.android.libjni.LibJavaHeader

此时在 src 目录下生成了一个名为 com_android_libjni_LibJavaHeader.h的头文件,

其内容如下:

com_android_libjni_LibJavaHeader.h: 

 

#include<jni.h> 

 

#ifndef_Included_com_android_libjni_LibJavaHeader 

#define_Included_com_android_libjni_LibJavaHeader 

#ifdef __cplusplus 

extern "C" { 

#endif 

 */

* Class:        com_android_libjni_LibJavaHeader 

* Method:       Add 

* Signature: (II)I 

 

@Override

public void onCreate(Bundle savedInstanceState){ 

      super.onCreate(savedInstanceState); 

int iResult = new LibJavaHeader().Add(5,6); 

TextView tv = new TextView(this); 

tv.setText(Integer.toString(iResult)); 

setContentView(tv); 

 {   

    

static

 }   

System.loadLibrary("addjni"); 

 {

{

3、编写库的封装函数 libaddjni.c 

根据前面生成的 com_android_libjni_LibJavaHeader.h 文件,编写libaddjni.c,用

来生成 libaddjni.so 

libaddjni.c: 

#include<jni.h> 

#include "Add.h" 

#ifdef __cplusplus 

extern "C" { 

#endif 

 */

* Class:        com_android_libjni_LibJavaHeader
* Method:      Add 

* Signature: (II)I 

 /*

JNIEXPORT jint JNICALLJava_com_android_libjni_LibJavaHeader_Add 

    (JNIEnv*pJE, jobject jo, jint jiX, jint jiY) 

 }

          
   returnAdd(jiX, jiY); 

 {

#ifdef __cplusplus 

 {

#endif 

在 Android 源码的 platform/external新建一个文件夹 libaddjni,将libaddjni.c、Add.h

放入该目录,创建 Android.mk,内容如下:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_PRELINK_MODULE := false 

LOCAL_SRC_FILES := libaddjni.c 

LOCAL_SHARED_LIBRARIES := libadd 

LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) 

LOCAL_MODULE := libaddjni 

include $(BUILD_SHARED_LIBRARY) 

然 后 将 libadd.so 拷 贝 到 out/target/product/generic/obj/lib和

out/target/product/generic/system/lib 目 录中 , 在 platform 目 录下运行make 

libaddjni 编译之后会产生一个out/target/product/generic/obj/lib/libaddjni.so

4、开始测试

#adb push libaddjni.so /system/lib 

#adb push libadd.so /system/lib 

然后在 eclipse 运行 andro

时间: 2024-12-30 06:32:58

android ndk jni 实例1的相关文章

Android NDK开发详细介绍_Android

Android之NDK开发  一.NDK产生的背景 Android平台从诞生起,就已经支持C.C++开发.众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言.但这并不等同于"第三方应用只能使用Java".在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,"Java+C"

Android NDK 开发教程_Android

Android NDK 是在SDK前面又加上了"原生"二字,即Native Development Kit,因此又被Google称为"NDK". 众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序. NDK包括了: 从C / C++生成原生代码库所需要的工具和build files. 将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages fi

Android通过JNI调用驱动程序(完全解析实例)

  [置顶] Android通过JNI调用驱动程序(完全解析实例)            要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是android 系统下提供一些特殊功能接口的方法! 本文前提:我们假设已经写了一个驱动程序,它是控制LED的亮灭的,并且创建了一个节点:/dev/vib,也就是通过open这个vib节点,可以read/writ

Android For JNI(六)——交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程

Android For JNI(六)--交叉编译,NDK概述以及文件结构,编写自己的第一个JNI工程 终于回到我们的 android了,我们先要配置这个NDK的环境,但是之前,我们还要了解一下基本的术语 一.交叉编译 在一个平台下编译出另一个平台可以执行的二进制程序 CPU平台:ARM X86 MIPS(指令集) 系统平台:windows linux mac 原理:模拟另一个平台的特性去编译程序 源代码-->预编译-->编译-->链接-->可执行程序 工具链:一个工具使用自动调用下

Android NDK r8 Cygwin CDT 在window下开发环境搭建 安装配置与使用 详细图文讲解

android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把环境搭建起来了,把过程记录下来分享给大家. 内容目录: 1.默认基础环境 2.NDK下载与配置 3.安装Cygwin 4.用NDK编译 5.安装CDT插件 6.安装Sequoyah插件 7.JNI编译环境配置 画了一个思维导图让大家一目了然配置过程   -------------------------

Android NDK 环境搭建 之 起始篇NDK HelloWorld

ADT插件:管理Android SDK和相关的开发工具的 NDK插件:用于开发Android NDK的插件,ADT版本在20以上,就能安装NDK插件,另外NDK集成了CDT插件(所以本文直接针对ADT 20以上版本进行说明) 到Android官网下载最新的NDK,注:NDK版本在r7以上之后就集成了Cygwin,而且还是十分精简版.比起下载Cygwin要方便多啦(Cygwin以前需要单独安装和配置,现在已被集成)! 下载链接见:http://developer.android.com/tools

《Android应用开发与系统改造实战》——1.5节Android NDK开发环境搭建

1.5 Android NDK开发环境搭建 Android应用开发与系统改造实战 1.5.1 Android NDK简介 Android NDK是编译嵌入在Android应用中的原生代码(C或C++)的工具. Android应用运行在Dalvik虚拟机上.NDK允许开发者用原生代码(C或C++)实现应用的一部分.这将给某些应用带来好处,这种方式可重用代码,而且在某些情况下可加快运行速度. NDK提供了将C和C++源代码生成原生代码库的工具和文件:提供了将原生库嵌入apk文件的方法:提供了兼容An

Android NDK开发的环境搭建与简单示例_Android

一.NDK与JNI简介 NDK全称为native development kit本地语言(C&C++)开发包.而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发). 简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用.NDK开发的可以称之为底层开发或者jni(java native interface)层开发,SDK开发可以称为上层开发. Andro

Android在JNI中使用ByteBuffer的方法

  Android在JNI中使用ByteBuffer的方法 本文实例讲述了Android在JNI中使用ByteBuffer的方法.分享给大家供大家参考.具体如下: 一.ByteBuffer 定义 在NIO中,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区) 缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方