25 linux ndk 头文件_NDK在Linux下载配置以及C、C++编译配置(交叉编译)

本文详细介绍了如何在Ubuntu虚拟机中安装NDK,配置环境变量,并进行C、C++的交叉编译,以创建能在Android设备上运行的可执行文件和动态库。首先下载NDK并解压,然后将其移动到指定目录并配置环境变量。接着,通过示例演示了如何编译C程序并推送到Android设备上运行。最后,展示了如何编译动态库并将其整合到Android项目中,实现动态库在Android应用中的调用。
摘要由CSDN通过智能技术生成

前言:

我们搭建好Ubutu虚拟机之后,通过xShell远程登录Ubutu上SSH服务器,在xShell上可以进行相关的编译操作了。但是我们在xShell上gcc、g++编译的可执行文件只能在Linux上执行,但是我们需要编译出来的东西可以在Android端使用,这就需要进行交叉编译,在Ubutu上编译出Android可执行的文件以及动态库。在编译之前,需要将NDK下载安装完成,并且成功配置环境变量,才能进行下面编译。废话不多说了,开始介绍了(备注:以下命令均在xShell中输入完成的):

1、下载安装NDK以及配置环境变量

下载完成之后查看当前目录(主要是查看下载完之后安装包的名字:android-ndk-r17-beta2-linux-x86_64.zip):

ls -l

解压安装

unzip android-ndk-r17-beta2-linux-x86_64.zip

解压完成之后再次查看目录:

ls -l

你将会看到一个文件夹:android-ndk-r17-beta2(这个就是解压之后文件夹)根据个人习惯,将此文件夹放在存储的位置。

我是将此文件夹移动到/usr/local/目录下:

mv android-ndk-r17-beta2 /usr/local/

配置NDK的环境变量:

vi /etc/profile

进入之后输入一个i,进入编辑状态

export NDK=/usr/local/android-ndk-r17-beta2

export PATH=$PATH:$NDK

按一下返回键,再按:,再输入wq! 保存并退出。

刷新一下/etc/profile

source /etc/profile

检查是否安装成功:

ndk-build -v

image.png

到这里只是将NDK安装成功了而已,编译之路漫长。

2、交叉编译Android可执行文件

创建一个C文件,并在里面编写相关的代码:

vi main.c

#include

void main(){

printf("成都");

}

保存并退出,ls -l查看当前目录是否存在main.c的文件,这里我们需要用NDK里面的gcc编译器进行编译,南无我们进行相关环境变量的配置(在/etc/profile配置保存并退出)。同时也引入相关的头文件,不然找不到头文件。

export NDK_GCC=/usr/local/android-ndk-r17-beta2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

export HO="--sysroot=/usr/local/android-ndk-r17-beta2/platforms/android-21/arch-arm -isystem /usr/local/android-ndk-r17-beta2/sysroot/usr/include -isystem /usr/local/android-ndk-r17-beta2/sysroot/usr/include/arm-linux-androideabi"

配置好之后,我们进行编译

$NDK_GCC $HO -pie main.c -o main

这时候再去查看目录多了一个main文件,将main文件到处到桌面

sz main

这时打开Windows命令行(进入到桌面的目录,需提前配置好adb命令):

cd Desktop

将main文件放进存储卡

adb push main /sdcard/

使用adb shell命令

adb shell

进入到手机存储卡目录

cd /sdcard/

执行文件(需要手机获取root权限才可以执行)

./main

此时可在Windows命令行上面看到输出乱码(由于编码问题),表示成功了。这样操作就顺利完成交叉编译。

2、编译Android可执行动态库

创建一个C文件

#include

int test(int a){

return 20+a;

}

把创建的C文件编译成动态库,同样将该动态库导出到桌面

$NDK_GCC $HO -shared -fPIC test.c -o libTest.so

创建一个Android NDK项目,按照下图目录将.so文件放置进去

image.png

好了接下来我们配置Android端动态库相关信息(native-lib.cpp文件)

#include

#include

#include

extern "C"{

extern int test(int a);

}

extern "C"

JNIEXPORT jstring JNICALL

Java_com_example_administrator_lsn_19_MainActivity_stringFromJNI(JNIEnv *env, jobject instance) {

std::string hello = "Hello from C++";

__android_log_print(ANDROID_LOG_ERROR,"jni","libtest.so 里面的 test 方法:%d",test(5));

return env->NewStringUTF(hello.c_str());

}

CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.

native-lib

SHARED

src/main/cpp/native-lib.cpp )

find_library( # Sets the name of the path variable.

log-lib

log )

#设置一个变量

#CMAKE_CXX_FLAGS c++参数 会传给编译器

#CMAKE_C_FLAGS c参数 会传给编译器

#重新定义 CMAKE_CXX_FLAGS变量

#CMAKE_SOURCE_DIR指的是当前这个文件的地址

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a")

target_link_libraries( # Specifies the target library.

native-lib

Test

# Links the target library to the log library

# included in the NDK.

${log-lib} )

最后在Maintivity使用

package com.example.administrator.lsn_9;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.

static {

System.loadLibrary("native-lib");

System.loadLibrary("Test");

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView tv = (TextView) findViewById(R.id.sample_text);

tv.setText(stringFromJNI());

}

public native String stringFromJNI();

}

可以看到输出的日志中结果是25,成功运行动态库里面的test(int a)方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值