0:前言

1:本文主要作为丙方android公司的身份来写

2:作者有不对的地方,请指出,谢谢

[第一篇:android利用jni调用第三方库——编写库libhello.so]

[第二篇:android利用jni调用第三方库——编写库android程序直接调用第三方库libhello.so]

[第三篇:android利用jni调用第三方库——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so]

1:场景:公司接到任务,说配合乙方C++公司开发android识别程序,项目布置到项目经理,然后经理把任务交给你来做,你自然是先抱怨一番,活多钱少让我这新人来干,哎没办法啊,干吧!

2:东西:乙方C++公司交给我的东西有

libhello.so库文件
com_hello_hello_HelloActivity.h头文件(有可能没有这个,我是死命要来的)
库的接口说明文档

3:搞起:

  1. 看了看给的接口说明文档,哎呦,不错哦,文档说明很详细,里面的函数接口定义的完美,而且他的库定义符合jni的规范,不需要在添加什么东西了,直接在android程序中调用就行,good啊
  2. 新建项目helloword2,在根目录下新建libs/armeabi文件夹,然后把库libhello.so放进去,然后重头戏来了-》新建包com.hello.hello,原来的包叫com.hello.word,之所以这样做,是我经历了一个痛苦的过程总结出来的,他给的头文件
    com_hello_hello_HelloActivity.h   //符合jni的规范,前面com_hello_hello是包名,后面HelloActivity是类名,注意在丙方这里叫类名,在乙方那里叫Activity的名字

    能够看出来他的包结构,然后就建立一个和他一样的包,在这个包中新建一个和他一样的类,类中的方法按照jni规范能够得出来是什么,比如

    JNIEXPORT jstring JNICALL Java_com_hello_hello_HelloActivity_sayHello(JNIEnv *, jclass);//其中有一个方法是无参数函数sayHello

    结构如图

  3. 类HelloActiviry.java的代码
    package com.hello.hello;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.os.Bundle; public class HelloActivity {
    // static
    // {
    // System.loadLibrary("hello"); //实验证明在这里不需要引入包名也是可以的
    // }
    public static native String sayHello(); // 第三方库函数 }
  4. android主程序Helloword2Acitiviry.java的代码
    package com.hello.word;
    import com.hello.hello.HelloActivity;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.os.Bundle;
    public class Helloword2Activity extends Activity {
    static
    {
    System.loadLibrary("hello"); //引入包名
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new AlertDialog.Builder( this ).setMessage(new HelloActivity().sayHello()).show();//实例化类方法直接调用
    }
    }
  5. 运行android程序,注意你写的是android程序,不需要修改编译选项,运行如图,实验证明,利用android直接调用库是可以的
  6. 但是这种直接调用也是有弊端的,在第三篇中会介绍-》》》[第三篇:android利用jni调用第三方库——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

4:下载demo[猛戳这里下载demo

[置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so的更多相关文章

  1. android调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so (转载)

    转自:http://blog.csdn.net/jiuyueguang/article/details/9449737 版权声明:本文为博主原创文章,未经博主允许不得转载. 0:前言 1:本文主要作为 ...

  2. [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so

    0:前言: 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于: 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直 ...

  3. [转][android][利用JNI技术在Android中调用、调试C++代码]

    在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...

  4. 第二篇 界面开发 (Android学习笔记)

    第二篇 界面开发 第5章 探索界面UI元素 ●The Android View Class     ●△Widget设计步骤 需要修改三个XML,以及一个class: 1)第一个xml是布局XML文件 ...

  5. gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第二篇:gradle简单实战

    一个bug 一个脚印的叫你们用gradle. 1介于网络上的很多资料都是老的 不适用与现在的新版本gradle 尤其是有些gradle方法改名了老的用不了 2介于网上都是粘贴复制并且零碎我很蛋疼啊,走 ...

  6. Android学习笔记(第一篇)编写第一个程序Hello World+Activity

    PS:终于开始正式的搞Android了...无人带的一介菜鸟,我还是自己默默的努力吧... 学习内容: 1.编写第一个Hello World程序..   学习Android,那么就需要有一个编译器来集 ...

  7. android apk 防止反编译技术第二篇-运行时修改字节码

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  8. android apk 防止反编译技术第二篇-运行时修改Dalvik指令

    上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...

  9. [置顶] 【其他部分 第一章 矩阵】The C Programming Language 程序研究 【持续更新】

    其他部分 第一章 矩阵 一.矩阵的转置   问题描述: 编写函数,把给定的任意一个二维整型矩阵转换为其转置矩阵. 输入: 1 2 3 4 5 6 输出: 1 4 2 5 3 6 分析 题目要求编写一个 ...

随机推荐

  1. 让QT对话框显示中文

    http://blog.sina.com.cn/s/blog_8254427901011fxv.html (1)从QT安装目录下面将文件“qt_zh_CN.qm”复制一份到你的项目目录下. 例如,我是 ...

  2. 使用plist的好处

    首先:帮助节省内存.OpenGL ES纹理要求宽和高都是2的n次幂的倍数.我们可以考虑将小的图片拼大图片,然后统一加载.  其次:提高渲染速度.OpenGL ES要求切换的纹理越少越好,将图片拼成大图 ...

  3. 旧的VirtualBox News(从1.3.4开始)

    https://linuxtoy.org/archives.html https://linuxtoy.org/archives/virtualbox-134.html http://www.cnbl ...

  4. TPen的7种Style和16种Mode

    //TPen 的主要属性有四: Color.Width.Style.Mode {Color: 颜色} {Width: 宽度; 默认是 1; 如果赋予 <= 0 的值, 会使用默认值} {Styl ...

  5. Android APN配置

    APN概念 APN(Access Point Name),即“接入点名称”,用来标识GPRS的业务种类,目前分为两大类:CMWAP(通过GPRS访问WAP业务).CMNET(除了WAP以外的服务目前都 ...

  6. php将文件夹打包成zip文件

    function addFileToZip($path,$zip){    $handler=opendir($path); //打开当前文件夹由$path指定.    while(($filenam ...

  7. gcc中-pthread和-lpthread的区别

    最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!!!然后man了一下,才发现在gcc 4.7中链接线程库使用-pt ...

  8. java对象的内存布局(二):利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值

    在上一篇文章中.我们列出了计算java对象大小的几个结论以及jol工具的使用,jol工具的源代码有兴趣的能够去看下.如今我们利用JDK中的sun.misc.Unsafe来计算下字段的偏移地址,一则验证 ...

  9. ORA-32001: 已请求写入 SPFILE, 但是在启动时未指定 SPFILE

    SQL> alter system set smtp_out_server='smtp.126.com' scope=both;alter system set smtp_out_server= ...

  10. 修改EBS R12 URL连接端口

    (TEST环境8002端口)1.停止所有应用服务2.修改<SID>_<server>.xml配置文件(如test_vis.xml)cd $APPL_TOP/admin (如cd ...