`

如何使用android的ndk建立native的开发环境

 
阅读更多

从网上看了一篇使用andriod的toolchain在cygwin上来建立android的开发环境,但是在vista上编译始终失败,在xp上能够成功。但是编译的时间比较长,而且对于新手来说也比较麻烦,难道就没有简单的方法吗?google已经把andriod的ndk已经放出来了,所以我就想着打它的主意了,把它配置一下,就能来开发c的程序了。旁边小伙肯定笑了,“搞啥?,有病啊,ndk就是一个开发native code的环境。”大哥,我当然知道了,虽然使用ndk来开发native code相对容易,但是它的.mk文件我看的是云里雾里,我本来想调用自己写的另外一个so库,都不知道在.mk文件里如何写,我现在也懒的去看ndk里面的mk文件,等哪天(哪天?天晓得是哪一天)有空了好好研究一下。好了,闲话少说,开练吧。首先安装cygwin,这个网上的教程多的是,就不说了,接着下载android ndk,这个在andriod的官网上就有了,然后下载一个从android模拟器里取system lib的工具busybox,然后调用命令

$adb push busybox /dev/sample/busybox

$adb shell chmod 777 /dev/sample/busybox

$adb shell ./dev/sample/busybox tar -cf /dev/sample/libs.tar /system/lib

$adb pull /dev/sample/libs.tar libs.tar

这样就将模拟器下的 /system/lib 目录的所有库(so)文件打包并下载下来了,解压libs.tar就得到了我们所需要的所有库文件。

接着将所有的文件copy 到 $(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1,好了,这个时候基本的配置工作就结束了,怎么样简单多了吧。

接着编写一个简单的c文件 tutorial01.c

#include <stdio.h>

int getinformation()

{

return 0;

}

然后编写一个Makefile文件

CC = /cygdrive/f/software/android/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gcc

CFLAGS = -g -O2 -fPIC -DANDROID -I ./ -I ../ -I F:/software/android/android-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/include

SDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-soname,$@ -Wl,-shared,-Bsymbolic -lc

CRT_OBJS= -lz -lm

all: libtutorial01.so

libtutorial01.so: tutorial01.o

$(CC) $(SDFLAGS) -o $@ tutorial01.o $(CRT_OBJS)

tutorial01.o: tutorial01.c

然后make,这个时候会报错 can't find "armelf.xsc", 在ndk的目录里搜索一下,搜到之后copy 到$(NDK)/build/prebuilt/windows/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1,然后make,成功。这样一个简单的so文件就生成了,这个时候如果想在android的虚拟机上运行,我们还需要给它包装一下。再编写一个文件test01.c,在这里是使用dl动态加载so文件,静态加载始终有问题,搞不清楚android是如何搜索目录,而且现在只能用绝对路径,这个问题还得仔细研究研究。

#include <string.h>

#include <jni.h>

jint

Java_com_example_testffmpeg_testffmpeg_getinformation( JNIEnv* env,

jobject thiz )

{

void* filehandle = dlopen("/data/data/com.example.test/lib/libtutorial.so", RTLD_LAZY );

int ll = -1;

if(filehandle)

{

int( * getinformation ) ();

getinformation = dlsym(filehandle, "getinformation");

if( getinformation )

{

ll = getinformation();

}

else

{

ll = -3;

}

dlclose(filehandle);

filehandle=0;

}

else

{

ll = -2;

}

return ll;

}

同样再来一个Makefile文件

CC = /cygdrive/f/software/android/android-ndk-1.5_r1/build/prebuilt/windows/arm-eabi-4.2.1/bin/arm-eabi-gcc

CFLAGS = -g -O2 -fPIC -DANDROID -I ./ -I ../ -I F:/software/android/android-ndk-1.5_r1/build/platforms/android-1.5/arch-arm/usr/include

SDFLAGS = -nostdlib -Wl,-T,armelf.xsc -Wl,-shared,-Bsymbolic -Wl,-soname,$@ -lc -L ../tutorial

CRT_OBJS= -lz -lm -ldl

all: libtest01.so

libtest01.so: test01.o

$(CC) $(SDFLAGS) -o $@ test01.o $(CRT_OBJS)

ok, make一下成功。好了,接下来使用andriod的sdk写一个简单的activity, testapp来测试其运行情况,以下是test01.java的代码。

package com.example.test;

import android.app.Activity;

import android.widget.TextView;

import android.os.Bundle;

public class test01 extends Activity

{

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

/* Create a TextView and set its content.

* the text is retrieved by calling a native

* function.

*/

TextView tv = new TextView(this);

// tv.setText( stringFromJNI() );

Integer ll = getinformation();

String lls = ll.toString();

tv.setText(lls);

setContentView(tv);

}

/* A native method that is implemented by the

* 'hello-jni' native library, which is packaged

* with this application.

*/

public native int getinformation();

/* this is used to load the 'hello-jni' library on application

* startup. The library has already been unpacked into

* /data/data/com.example.HelloJni/lib/libhello-jni.so at

* installation time by the package manager.

*/

static {

System.loadLibrary("test");

}

}

在eclipse中运行,在模拟器上显示0,就表示成功了。

busybox在此下载https://sites.google.com/site/anakia/Home/android-native01/busybox?attredirects=0

例子代码在此下载:https://sites.google.com/site/anakia/Home/android-native01/samples.zip?attredirects=0


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/anakiagmail/archive/2009/08/13/4441048.aspx

分享到:
评论

相关推荐

    详解如何使用Android Studio 进行NDK开发和调试

    个人认为使用Android Studio作NDK开发是必然趋势,所以本文将简单介绍如何在Android Studio上实现NDK开发。 简介 JNI JNI 是Java Native Inteface的缩写,是Java中定义的一种用于连接Java和C/C++接口的一种实现方式...

    Android NDK开发环境搭建PDF

    目 录 1 Cygwin 1.1 Cygwin下载 1.2 Cygwin安装 2 NDK 2.1 NDK下载 2.2 Cygwin配置NDK ...4 Android项目NDK环境配置 4.1 .so文件Builder 4.2 导入include文件及编译 4.3 Native向logcat输出调试信息

    Android native 开发

    原生NDK的公布可以让开发者更加直接的接触Android系统资源,并使用传统的C或C++语 言编写程序,并在程序封包文件(.apks)中直接嵌入原生库文件。NDK的公布让原来从事C语言 开发者也参与到Android平台,也让java...

    Android NDK环境搭建与配置说明

    NDK全称:Native Development Kit。  1、NDK是一系列工具的集合。  * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。  ...

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

    一、NDK与JNI简介 NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-...Android开发中使用NDK的原因: 1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全

    基于ARM64架构的Android操作系统GCC交叉编译器

    具链主要用于编译针对ARM64架构(即AARCH64)的Android操作系统和应用的...开发NATIVE代码库:对于需要使用Android NDK(Native Development Kit)开发性能敏感的应用或者游戏,此工具链提供编译这些应用所需的环境。

    android studio 下集成ndk 通过java jni调用c

    自己在android studio 环境下集成ndk 、 cmake 、LLDB 等插件 开发的一个demo ; 可以直接debug到c端代码,eclipse一般追踪不到,遇到c端出问题手机直接一个crash,,,想要了解android studio 下如何进行c 开发的...

    Android NDK开发简单程序分享(Hello Word!)

    在之前的博客中已经为大家介绍了,如何在...打开开发环境eclipse,在左侧空白区域,右键单击创建Android工程(非常简单,不再赘述)。 第二步,编译头文件 打开我们的主Activity,在里面定义一个native类型的方法: pu

    android开发实践之ndk编译命令简单示例

    Android提供了NDK工具,用来编译native代码(c/c++),该工具配置好了相关的交叉编译环境和工具链,只需要你简单地编写几个.mk文件即可将你的c/c++代码编译为Android的java工程/Android手机可以识别、加载和运行的库...

    安卓开发环境切换工具

    自己配置多个安卓 SDK NDK JAVA 环境路径。然后通过脚本批处理更换环境变量。以达到工作中快速切换环境的目的。附件里我放的两个 环境变量是我本机的 cocos2d-x android开发环境 和 react native 的安卓环境

    AndroidStudio_3.0版本JNI开发

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地...

    浅谈react-native热更新react-native-pushy集成遇到的问题

    主要步骤按官方文档实现,这里只记录遇到的一些小坑 ...以上这篇浅谈react-native热更新react-native-pushy集成遇到的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。

    Android使用google breakpad捕获分析native cash

    Android 开发高手课 课后练习(1) 一、Chapter01 崩溃 https://time.geekbang.org/column/article/70602 https://github.com/AndroidAdvanceWithGeektime/Chapter01 1、遇到native cash时,生成.dmp文件 先检查sdk/...

    利用OpenCV实现在Android系统下的人脸检测 (2011年)

    简单介绍了开发环境搭建以及利用Android程序框架实现此应用程序的过程,同时详细阐述了利用JNI( Java Native Interface) 调用OpenCV相关函数的具体步骤,以及采用Android NDK( Native Development Kit)生成共享库的...

    安卓版CC++编程软件

    c4droid是款Android设备上的C/C++程序IDE(集成开发环境),默认以tcc(tiny c compiler)为编译器,可以选择安装gcc插件(20mb,只有root用户可以使用),选用gcc后,可以用sdl(简单直控媒体层库,需安装sdl plugin ...

    Hippy跨端开发框架 v2.16.0

    Hippy的设计是面向传统Web开发者的,特别是之前有过ReactNative和Vue的开发者用起来会更为顺手,Hippy致力于让前端开发跨端App更加容易。 到目前为止,腾讯内已经有了18款流行App在使用Hippy框架,每日触达数亿用户...

    mobile:适用于 iOS 和 Android 的标准笔记 - https

    标准笔记iOS & 安卓应用是您的笔记、想法和生活工作的安全场所。... 如果您想构建 Android 应用程序,则需要安装 Android NDK。 我们使用来自 Libsodium 加密库的本机代码来实现高性能。 您可以在

    基于Android studio3.6的JNI教程之opencv

    NDK:r14b(尽量使用该版本) Opencv3.4.1 android sdk   (1)新建工程OpenCVDemo,选择,一定要选择Native c++类型,最后要选c++14支持。 (2)File-&gt;Project Structure-&gt;SDK Location,设置这3个路径,NDK选择r14b。 ...

    Android JNI详解,让你彻底了解JNI (上)

    本套课程共分为三部分,当前为第一部分,主要包括内容:1、JNI名词释义2、JNI环境搭建3、Native项目解析4、编译工具使用5、边学边实战,从易到难,循序渐进适合人群:1、有一定Android基础,零JNI基础的学员;...

Global site tag (gtag.js) - Google Analytics