为了实现android的二次开发,希望通过编制动态链接库(.so)的方式实现android native C程序的调用。更为实际的情况则是:编制新库(new.so)调用android的老库(如libskia.so libskiagl.so)。

以图形库skia为例,具体过程如下:
  1.下载完整的skia代码,代码自己到google上搜吧(重要提示:wiki,TortoiseSVN)
(更重要的提示:这步可以跳过,如果你的开发与硬件驱动无关的话)
  2.通过git下载android源码:xxxx/core,xxxx/base,xxxx/skia三个文件夹就够了。(重要提示:xxxx我也忘了代表什么了,找到android源码git文件的下载列表,搜索页面就可以了,都下载,都下载!!)
  3.编译skia文件夹,获得skia对应的so文件。
  3.1如果你的skia文件夹来自skia官网,那就看看目录下的config文件,编写你的make.out文件,之后编译,出错,再编译,再出错。。。是因为缺少头文件,对吧?,这些头文件与硬件或图像编码有关,比如说atomic.h啊png.h啊什么的。找吧!!补上!!还是报错的话,就是因为还缺少某些定义,报错一大推“undeclared”,找不到就只能自己写,当然前提是你对你的开发板足够熟悉,比如skia要求mutex的申明,并实现这个自旋锁的占用和释放接口。
        (重要提示:4.1步 你可以跳过,怎么样?开心吧?)
  3.2在ndk文件夹里搜索,获得libskia.so, libskiagl.so, libjnigraphics.so 
   复制,拷贝。没了
  4.新建项目文件夹,把第二步的core,base,skia三个文件夹扔进去。在项目文件夹里新建个lib文件夹,把第三步生成的so文件扔到lib里。新建jni文件夹,在jni里编写你的cpp文件。(重要提示:你可以不仔细看我写的东西,但如果你是在没有仔细看NDK自带doc文件夹里那十几篇英文参考的情况下这么做,那你一定会生不如死的)
  5.搜索skia文件,找到skcanvas.h,看看我们能用skia干什么。和android相比,skia的自述文件俨然像是个天使。不理解什么是天使?请参看android NDK下的文档。
  6. 以画画写字为例,我的cpp文件如下:

#include <jni.h>
#include <time.h>
#include <android\log.h>
#include <android\bitmap.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "SkBitmap.h"
#include "SkDevice.h"
#include "SkPaint.h"
#include "SkRect.h"
#include "SkImageEncoder.h"extern "C"
{
JNIEXPORT jint JNICALL Java_JNItestForGraph_JNItestForGraph_TestBackView_changeback(JNIEnv * env, jobject  obj, jobject bitmap, jint time);
}
JNIEXPORT jint JNICALL Java_JNItestForGraph_JNItestForGraph_TestBackView_changeback(JNIEnv * env, jobject  obj, jobject bitmap, jint time)
{AndroidBitmapInfo  info;int*              pixels;int ret;ret = AndroidBitmap_getInfo(env, bitmap, &info);ret = AndroidBitmap_lockPixels(env, bitmap, (void**)&pixels);int width=(int)info.width;int height=(int)info.height;SkBitmap bmp = SkBitmap();bmp.setConfig(SkBitmap::kARGB_8888_Config,width,height,0);bmp.setPixels((void*)pixels);SkCanvas backgroud(bmp);SkPaint paint;paint.setARGB(255, 255, 0, 0);SkRect r;r.set(25, 25, 145, 145);backgroud.drawRect(r, paint);AndroidBitmap_unlockPixels(env, bitmap);backgroud.drawRect(r, paint);paint.setARGB(255, 0, 255, 0);r.offset(20, 20);backgroud.drawRect(r, paint);paint.setARGB(255, 0, 0, 255);r.offset(20, 20);backgroud.drawRect(r, paint);paint.setARGB(255, 0, 0, 0);backgroud.drawText("ABCD", 4*sizeof(char), 0, 100 , paint);return (ret);
}

  7.编写android.mk和appliction文件,具体怎么写,直接拷贝NDK下sample里的同名文件,再修改一下就可以了。具体怎么改。。。兄弟!不是我蒙你,还是看看NDK下的自述文档吧,我收回在第5步所说的话。用NDK文件夹下的ndk-build编译,根据出错信息关联所需头文件,都在你之前下载的几个文件夹里了,真的。编译成功,会在lib文件夹得到新的so文件。(重要提示:mk文件中记得带上-lskia,-lskiagl,-ljnigraphics)
  8.编写JAVA程序调用上面的函数。该怎么写呢? 
打开eclipse,新建工程,在程序中先Loadlibrary,再native C申明,具体。。。网上搜吧,要么就看看NDK下面sample里随便哪个例子,那个plasma就不错。
  9.运行ecplise里的项目,之前先看看有没有把so文件放到项目所在地的lib中。
  10.下载到真机上运行,较低版本的机器,会缺少libjnipraphics.so库,需要在apk中添加。

  

Reprinted from http://dev.wo.com.cn/bbs/viewthread.jsp?tid=77553

转载于:https://www.cnblogs.com/qiengo/archive/2012/07/20/2601449.html

Android库so文件及skia函数的调用相关推荐

  1. android 的函数调用,安卓版在函数内部调用子程序,子程序如何能得到函数过程中得到的变量 _ 按键精灵手机版 - 按键精灵论坛...

    Function head() Dim intX,intY FindPic 169,863,319,1420,"Attachment:11.png","000000&qu ...

  2. 2017年Spring发布了30个新的Android库,值得您关注

    by Michal Bialas 由Michal Bialas 2017年Spring推出的30个最酷的Android库 (The 30 Coolest Android Libraries from ...

  3. python3 selenium 自动化 登录搜狐邮箱之 函数的二次封装和模块的调用及函数的调用

    先建一个 sohuEmailPublic.py 文件,对函数进行封装,让它作为公共的模块开使用 代码如下: from selenium import webdriver from time impor ...

  4. 【Android 内存优化】libjpeg-turbo 函数库交叉编译与使用 ( 交叉编译脚本编写 | 函数库头文件拷贝 | 构建脚本配置 | Android Studio 测试函数库 )

    文章目录 一.交叉编译 Shell 脚本参考 二.NDK r16b 版本配置 三.libjpeg-turbo 交叉编译 Shell 脚本 四.执行 libjpeg-turbo 交叉编译 Shell 脚 ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )

    文章目录 前言 一.Android 进程读取文件所需的权限 二.fopen 打开文件标志位 三.验证文件权限 前言 一.Android 进程读取文件所需的权限 通过 注入工具 , 将 libbridg ...

  6. 嵌入式Linux支持dlopen,Android下使用dlopen函数动态调用.so链接库

    在这篇文章([09.03.25]Linux环境中dlopen函数的简单应用)中.实现了在UBUNTU LINUX环境下使用dlopen函数动态调用.so链接库.但是也提到了在Android下未能成功. ...

  7. python调用js库中的函数_Python 调用JS文件中的函数

    Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...

  8. 【C 语言】动态库封装与设计 ( 动态库调用环境搭建 | 创建应用 | 拷贝动态库相关文件到源码路径 | 导入头文件 | 配置动态库引用 | 调用动态库中的函数 )

    文章目录 一.在 Visual Studio 2019 中创建 " 控制台应用 " 程序 二.拷贝 xxx.lib.xxx.dll.xxx.h 到源码路径 三.导入 xxx.h 头 ...

  9. 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )

    文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...

最新文章

  1. 远心镜头技术及其选型介绍
  2. Java后端向前端传递数据,挥泪整理面经
  3. ecshop分类页调用分类名称
  4. Oracle 11g 通过创建物化视图实现不同数据库间的表数据同步
  5. Java反射理解与案例
  6. linux下通用Makefile写法
  7. gwt 嵌入html_GWT和HTML5画布演示
  8. appium 如何调用 adb_带你了解可用于Android APP自动化测试的框架:Appium
  9. jQuery学习之三---工具
  10. 修改Firebug字体
  11. 详解样条曲线(上)(包含贝塞尔曲线)
  12. 【2022年】帝豪gs/帝豪gl 车机安装第三方软件教程
  13. 无人机怎么设定航线_飞行航线设置方法及装置与流程
  14. 关于动态生成data组件
  15. JavaScript 根据身份证号获取年龄
  16. 人保爱无忧易核版重疾险怎么样?好不好?
  17. IT界的复仇者联盟解读
  18. 本地局域网HTTPS解决方案 CA证书
  19. 华侨大学计算机组成原理期末考试试题,计算机组成原理试卷A卷答案
  20. sql 修改字段中部分值

热门文章

  1. heroku_了解如何使用Heroku部署全栈Web应用程序
  2. <论文翻译>RepVGG: Making VGG-style ConvNets Great Again
  3. 入链、出链、反向链接、内链、外链的关系
  4. Python培训教程:pycharm常用的快捷键合集
  5. https和http有什么区别?看下面介绍就知道了!
  6. 软件测试工程师如何提升自己?
  7. 计算机二级周小丹,亲爱的设计丨周小丹:始终认真,才能保持“天真”
  8. Chameleon跨端框架——壹个理想主义团队的开源作品
  9. hadoop install start-dfs.sh 失败
  10. 前后端分离的思考与实践(三)