如何使用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,就表示成功了。
温馨提示:内容为网友见解,仅供参考
无其他回答

Android JNI\/NDK环境的配置与Demo编译
要使用这些工具,首先,你需要配置NDK环境。接着,从Java类生成JNI头文件,编写并实现C\/C++代码,用CMake或ndk-build进行编译。在Android项目中,确保build.gradle配置了NDK,通过Gradle编译项目,并在Java代码中加载.so库,调用本地方法。总的来说,通过正确的配置和实践,JNI和NDK为Android开发者提供了...

如何在Android下使用JNI
安装好以上android应用程序的开发环境后,还可以选择是否需要配置emulator和adb工具的环境变量,以方便在进行JNI开发的时候使用。配置步骤如下: 把emulator所在目录android-sdk-linux\/tools以及adb所在目录android-sdk-linux\/platform-tools添加到环境变量中,android-sdk-linux指androidsdk安装包android-sdk_rxx-linux的解压目录。

Android 中Native方法是怎样调用的
7.然后实现在工程Why下创建目录jni,并且copy com_yarin_android_Why_Jni.c \/h 到jni目录下。8.在"Why\\jni"目录下编写Android.mk ,在"android-ndk-r6b\\jni"下编写Application.mk , 然后在NDK环境下编译native code,生成动态库libWhy.so。9.在java工程中加入调用native 动态库的代码:package co...

React Native 0.74 Android 环境搭建指南
1.2 安装JDK如果电脑上已有JDK1.8版本,请确保替换为React Native 0.74所需的版本。通过运行命令查看所有安装的JDK版本,若不符合要求,需按照官方指南安装相应版本的JDK。推荐使用Zulu OpenJDK以提高性能和稳定性。1.3 安装Android Studio依据官方Android教程,安装Android编辑器、Android SDK和Android虚拟...

使用VSCode流畅开发Android native ELF
如memory write。对于初学者,一个现成的项目模板可以节省不少时间,可以参考我在GitHub上的模板项目:github.com\/ddddhm1234\/vscode_ndk_example。文档支持可以在官方开发者文档中找到:developer.android.com\/n...。通过这些步骤,你将拥有一个流畅的VSCode Android native ELF开发环境。

深入Linux环境下NDK的配置方法linux配置ndk
Linux环境下的NDK(Native Development Kit)是一种开发工具,它使开发者能够使用C和C++编写针对Android设备的原生应用程序。在此文中,我们将详细介绍如何在Linux环境下配置NDK。第一步:下载并安装NDK。下载最新版本的Android NDK,按照官方文档指导安装即可。如果要使用不同版本的NDK,请下载女性对应版本的...

安卓jni开发?
第一步,安装jdk,配置jdk环境。百度搜jdk配置第二步,安装AndroidStudio+SDK。或者Eclipse+ADT+AndroidSDK。第三步,需要Android机子或者安装虚拟机。如有疑问,请提出。一:JavaSE编程Java是一种面向对象的开发语言,Android操作系统的应用层使用Java语言来开发,所以要想进行Android开发必须有良好的Java基础...

ANDROID NDK开发求助
开发者需要自行斟酌使用。 于是NDK就应运而生了。NDK全称是Native Development Kit。 NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。NDK将是Android平台支持C开发的开端。 二、为什么使用NDK 1.代码的保护。由于apk的java层代码很容易被反编译,而C\/C++库反汇难度较大。 2.可以方便地使用...

Android中NDK开发流程是怎样的?
【答案】:NDK应用的开发流程(在应用中定义本地接口(native), 编译成.h头文件,交由C程序员实现,将.c实现通过NDK编译成.so动态链接库,导入项目中libs\/armeabi,代码中调用该本地接口)

android ndk是什么
通过NDK,开发者可以直接访问底层硬件功能,实现特定的功能优化和系统级别的操作。例如,一些高性能游戏或需要底层硬件支持的应用通常会使用NDK进行开发。此外,Android NDK还提供了Java和C++之间的桥梁作用。由于Android应用程序通常使用Java或Kotlin进行开发,但有时为了提高性能或者实现特定功能需要使用到C++的...

相似回答