Linux下通过NDK的初步使用

参考资料:

1、版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明

http://eshock.blogbus.com/logs/61459223.html

2、http://www.cnblogs.com/anyanran/archive/2010/11/22/ndk1.html

1、平台及软件信息

通过 uname -a 查看:

Linux ubuntu 3.13.0-35-generic #62-Ubuntu SMP Fri Aug 15 01:58:01 UTC 2014 i686 i686 i686 GNU/Linux

为了确认各环境变量配置正确,可以通过:

java -version 查看:

java version "1.7.0_67"

Java(TM) SE Runtime Environment (build 1.7.0_67-b01)

Java HotSpot(TM) Client VM (build 24.65-b04, mixed mode)

ndk-build 查看:

Android NDK: Could not find application project directory !    

Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    

/home/anna/Downloads/android-ndk-r10b/build/core/build-local.mk:148: *** Android NDK:

Aborting    .  Stop.

同时在eclipse中安装好ADT和CDT插件,能正常运行java写的应用程序。

2、编写java代码

  新建Android工程,包名设置为”com.anna”,类名为JniTest,在其中实现native方法plus和sayHello,分别用于传回字符串和数字给java。代码如下:

package com.anna;

import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

public class JniTest  extends ActionBarActivity {

  public native String sayHello();

  public native int plus(int x,int y);

  @Override

  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_jni_test);

    int x = plus(3,2);

    System.out.println("The result in java is: "+x);

    //将返回的字符串设置为app的title

    this.setTitle(""+this.sayHello());

  }
  
  static{
    System.loadLibrary("mylib");
  }
}

3、生成com_anna_JniTest.h头文件

  实现native方法需要用javah命令生成相应的头文件,使用头文件中对native方法定义的形式来在C/C++语言中实现,而当前的java代码尚不能使用javac命令正确编译,因此提取出仅包含native方法的Java文件,进行编译获得相关信息。

public class JniTest{

  public native String sayHello();

  public native int plus(int x,int y);

}
使用 javah -jni JniTest 命令生成JniTest.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class JniTest */

#ifndef _Included_JniTest

#define _Included_JniTest

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     JniTest

 * Method:    sayHello

 * Signature: ()Ljava/lang/String;

 */

JNIEXPORT jstring JNICALL Java_JniTest_sayHello

  (JNIEnv *, jobject);

/*

 * Class:     JniTest

 * Method:    plus

 * Signature: (II)I

 */

JNIEXPORT jint JNICALL Java_JniTest_plus

  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus

}

#endif

#endif

  其中的两个JNIEXPORT句就是所需要的native方法描述,切记要在函数名之前添加包名,即Java_JniTest_sayHello ——> Java_com_anna_JniTest_sayHello

4、编写.c文件

  在路径下新建名为jni的文件夹,在其中新建mylib.c(根据System.loadLibrary("mylib");命名),内容为:

#include <string.h>

#include <jni.h>

JNIEXPORT jint JNICALL Java_com_anna_JniTest_plus(JNIEnv *env, jobject obj, jint x, jint y)
{
  return x+y;
}

JNIEXPORT jstring JNICALL Java_com_anna_JniTest_sayHello(JNIEnv *env,  jobject obj){
   return (*env)->NewStringUTF(env, "Hello from JNI ! ");
}

  在其中实现了int型和String类型数据的返回,C和java中数据类型并不完全对应,因此使用jint、jstring样式的命名方式方便编程。

5、编写Android.mk和Application.mk文件

  在jni文件夹下新建文件Android.mk,内容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE    := mylib
LOCAL_SRC_FILES := mylib.c

include $(BUILD_SHARED_LIBRARY)

  其中LOCAL_MODULE表示要生成的动态链接库.so文件的文件名(所生成的文件会自动添加lib头,即本次生成的so文件名为”libmylib.so”),LOCAL_SRC_FILES表示c文件的所在路径。

  在项目总目录下(即与src目录等同级)新建文件Application.mk,内容如下:

APP_PROJECT_PATH := $(call my-dir)

APP_MODULES      := mylib

  其中的APP_MODULES与LOCAL_SRC_FILES的内容相同。

6、生成libmylib.so文件

  切换命令行工具到jni目录下,使用 -ls  命令查看,文件夹内包含:

 Android.mk   mylib.c

  之后使用 ndk-build 命令,运行后命令行输出如下:

[armeabi] Install        : libmylib.so => libs/armeabi/libmylib.so

  根据输出可知,输出的so文件存放在整个项目的ibs/armeabi/路径下,如果没有的话,右键工程”refresh”一下就出现啦。

7、运行工程,查看输出结果

  LogCat中输出结果为:

  模拟器界面输出为:

  

  (注:Hello World是工程默认建立的TextView……)

时间: 2024-10-03 02:08:24

Linux下通过NDK的初步使用的相关文章

Linux下Android NDK环境配置以及配合eclipse使用NDK

最近由于项目中经常用到jni,在这里将使用jni不步邹分享给大家! 一.下载NDK http://developer.android.com/sdk/ndk/index.html 目前最新版本是r8(android-ndk-r8-linux-x86.tar.bz2) 二.配置环境 从r7版本开始,Linux下直接解压就可以使用,在windows下cygwin也已经集成在NDK里面了,解压完配置下环境变量就可以使用了. 在~/.bashrc(Linux下配置环境变量的文件)文件末尾加上: expo

Linux下NDK编译FFMPEG包含neon参数

FFMPEG编译成Android库已经有很多案例了,编译优化neon的也很多,以下是我通过实践成功的案例,这里主要讲编译的配置文件,其他设置可结合Linux下使用NDK编译FFMPEG(libstagefright)进行配置. config_android.sh NDK=/opt/android/android-ndk-r9 PLATFORM=$NDK/platforms/android-14/arch-arm/ PREBUILT=$NDK/toolchains/arm-linux-androi

ffmpeg2.2在ubuntu下使用NDK编译——并在android工程下测试使用

作者:wainiwann 出处:http://www.cnblogs.com/wainiwann/ 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 摘要:本文主要介绍将FFmpeg音视频编解码库移植到Android平台上的编译和基本测试过程. 环境准备: Ubuntu12.04 TLS android-ndk-r9d-linux-x86_64.tar.bz2 ffmpeg2.2 --------------------

Linux下的Mysql初步认实和搭建LAMP环境

Linux下的Mysql初步认实和搭建LAMP环境   实验目标 Mysql服务器常见概念 Mysql服务器安装及相关配置文件 实战:安装mysql数据库并去除安全隐患 实战:搭建LAMP环境部署Ucenter和Ucenter-home网站   实验概述 MySQL服务概述: MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Databas

Linux下Nagios的安装与配置[转]

一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知. Nagios原名为NetSaint,由Ethan Galstad开发并维护至今.NAGIOS是一个缩写形式: "Nagios Ain't Gonna Insist On Sainthood" Sainthood 翻译为圣徒

linux下的python基本介绍

[python]linux下的python安装及初步学习 linux下python的安装 尽管我的unbuntu 10.11版本已经默认更新了python的安装,但这里还是重新介绍一下如何在linux下安装   python.在网上也有一些安装教程. 摘来如下 1.下载源代码 http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2 2. 安装 $ tar –jxvf Python-2.5.2.tar.bz2 $ cd Python-

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

Linux下运行java项目

最近初步接触了linux,感觉很有新鲜感.之前在windows下干过的事情也便想到在linux环境下实现一下.正好手头在编java,就想既然java可以在windows的DOS操作下运行,是不是也可以在linux的terminal下编译执行呢?好奇心是最好的老师,网上丰富的资源帮助我很快的实现了这一操作.具体实现过程如下: 安装JDK 要编译执行java代码,首先需要有支持java的系统程序,所谓的jdk,java development kit就是干这个用的.无论是在windows还是Linu

Linux下Fork与Exec使用

http://www.cnblogs.com/hicjiajia/archive/2011/01/20/1940154.html Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程