文档章节

使用ndk-build编译 android调用的so库

cicue
 cicue
发布于 2015/10/14 15:09
字数 856
阅读 1787
收藏 4

前沿

编译so的方法有两种方法第一种就是编写原生的makefile文件利用gcc进行编译,这里我讲解的是另外一种。采用NDK提供的ndk-build编译。

简介

使用ndk编译的时候需要介绍它的脚本文件,Android.mk和Application.mk,但是Application.mk是可选的,用来描述原生程序用到的一些特性,如原生程序支持的ARM指令集。

Android.mk是工程的编译脚本,描述了编译原生程序所需要的选择项、头文件、源文件以及依赖库等。

实例

首先需要下载DNK,这个就不用多说了,我直接来说步骤吧。程序员一般都会对Hello,world感到亲切,我们就从hello,word开始。利用eclipse新建一个项目我取了新建了一个andoridNDKTest这个项目,先看看项目目录吧。

这里注意到上面的多了一个jni目录,这个目录就是java通过jni调用的代码放的地方,里面放了三个文件,我们还是首先来讲一下hello-jni.c这个文件,我们来看看代码。

#include <string.h>  
#include <jni.h>  
jstring  
Java_com_example_ndktest_MainActivity_stringFromJNI( JNIEnv* env,  
                                                  jobject thiz )  
{  
    return (*env)->NewStringUTF(env, "Hello world ");  
}

代码很简单就是命名有点长,第一个Java不用管就是jni的规定,然后后面的就是包路径和类名称最后是函数名。这个函数的作用就是返回一个字符串。

然后就是利用ndk来编译这个函数了,我们需要看看Android.mk和Applicaion.mk文件里面到底有些什么。

android.mk

LOCAL_PATH := $(call my-dir)  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE    := hello  
LOCAL_SRC_FILES := hello-jni.c  
  
include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH:=($call my-dir)定义了本地源码路径 call my-dir是编译系统提供的,返回的就是mk的路径。

include $(CLEAR_VARS) 指定让编译系统清楚掉一些已经定义过的宏,这些宏定义都是全局的,如LOCAL_MODULE、LOCAL_SRC_FILE,当一个GUN MAKE在编译多个模块时候,必须清楚并且重新设置他们。

LOCAL_ARM_MODE := arm指定原生程序用的指令集,这里上面我们没有用到。

LOCAL_MODULE:= hello指定生成程序的文件名,如果生成共享的库模块会生成libhello.so.

LOCAL_SRC_FILE:=hello-jni.c指定c或者c++源文件。

inlude $(BUILD_EXECUTABLE)指定生成文件的类型,BUILD_EXECUTABLE表示可执行文件,BUILD_SHARED_LIBRARY表示生成动态库,BUILD_STATIC_LIBRARY静态库。

然后是Applicaion.mk文件

APP_ABI := all

这句代码的意思是生成所有平台的编译结果。

其实到了这里你就可以直接进入jni文件夹里面输入ndk-build开始编译了,但是为了看到编译过后的运行结果我这里在eclipse里面编译,看图说话。

然后编译器就会自动的编译文件,最后就是android这边的调用了,我们来看看andorid的文件代码

public class MainActivity extends Activity {  
  
    //声明c的接口  
    public native String stringFromJNI();  
  
    static {  
        System.loadLibrary("hello");  
    }  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        TextView textView = (TextView) findViewById(R.id.hello);  
        textView.setText(stringFromJNI());  
    }  
}


然后让我们注意的是 这句代码
public native String stringFromJNI();
其实它就是函数生命,但是采用的native因为是在so里面的。
static {
System.loadLibrary("hello");
}

这句函数就更简单了,直接加载我们刚才编译好的so库。好了,如果没什么问题就直接run在手机上看效果吧。


本文转载自:http://blog.csdn.net/codebob/article/details/25338803

cicue
粉丝 15
博文 111
码字总数 75311
作品 0
徐汇
私信 提问
一篇好文之Android 调用C代码及生成调试so库

版权声明:本文为博主原创文章,转载请声明。 https://blog.csdn.net/qq_32175491/article/details/83588167 不靠谱的朱先生又来了,今天是周五,我又出现了!好了,不为自己多解释,上周没发...

aserbao
2018/11/02
0
0
【Android开发】:在任意目录执行NDK编译

文以简单的例子讲述如何在任意目录把自己写的C代码使用NDK提供的交叉编译该工具来编译成Android可使用的静态库/动态库。 1. 准备环境 首先,你得安装了Android的NDK编译工具,假设你的NDK的根...

shzwork
03/26
2
0
NDK学习五: [转载] NDK动态库的调用

来自:http://www.cnblogs.com/zhangweia/archive/2010/09/16/1828176.html NDK动态库的调用 Posted on 2010-09-16 15:46zhangweia 阅读(2797)评论(1)编辑收藏 NDK动态库的调用分两种情况。第......

木星青龙
2012/04/28
436
0
Android—JNI调用简单实例解析

转自:http://www.cnblogs.com/sevenyuan/p/4202759.html 感谢原作者的细心整理! 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj.jni; public class ......

80后小子
2015/11/12
7.1K
0
开发兼容英特尔架构的Android应用(三) 如何设置您的NDK应用

如何设置您的NDK应用 本篇主要介绍NDK应用的开发步骤,调试流程已经如何为英特尔架构设置您的NDK应用。 相关文章 •1. 开发兼容英特尔架构的Android应用(一) 应用架构介绍 •2. 开发兼容英特...

LiSteven
2013/08/07
167
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
10
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部