0:前言:

  1. 在第二篇中,我们主要介绍了丙方android公司利用乙方C++公司给的动态库,直接调用库中的方法,但是这样方式受限于:
    1. 乙方C++公司开发的动态库是否符合jni的规范,如果不规范,则不能直接调用
    2. 如果丙方android公司哪一天老板脑瓜抽筋说:“擦,咱们利用乙方C++公司给的库基础上再包装一下,再添加我们公司业务的新功能,打包成库,我们也卖!!!!”这种情况下不能直接调用乙方给的库了
    3. 有的库只是实现了基本的业务逻辑,更加复杂的需要调用库中的函数来实现
  2. 在本篇中,我们整合第三方库到我们自己的库中,详情请看下面

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

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

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

1:搞起:

  1. 同样也是从新建helloword的android程序开始,和第一篇中步骤一样,这里不再多说了,主要是内容不一样,我会贴出代码和解释
  2. 在jni文件夹中新建文件夹hello,在hello中新建include,hello放libhello.so,include中放头文件com_hello_hello_HelloActivity.h
  3. 结构如图
  4. src目录下有两个包,分别是
    com.hello.hello
    com.hello.word
  5. com.hello.hello包中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(); // 第三方库函数 }
  6. com.hello.word包中HellowordActiviry.java中的代码,这个Activity是我们的android主程序
    package com.hello.word;
    
    import com.hello.hello.HelloActivity;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.os.Bundle; public class HellowordActivity extends Activity {
    static{
    System.loadLibrary("hello"); //注意这里要引入两个包
    System.loadLibrary("helloword");
    }
    public static native String sayHelloWord(); // 本地库函数
    public static native String sayHello(); // 本地库函数
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    new AlertDialog.Builder( this ).setMessage( new HelloActivity().sayHello()).show();//这个是测试android直接调用库函数
    // new AlertDialog.Builder( this ).setMessage( sayHelloWord()).show();//这个是测试android调用我们自己的包
    // new AlertDialog.Builder( this ).setMessage( sayHello()).show();//这个是测试android调用我们自己的包整合第三方包后的调用函数
    }
    }
  7. 同样经过javah命令(不明白的地方请去看第一篇)生成头文件
  8. 自己的头文件com_hello_word_HellowordActivity.h代码,明显是自己的两个接口,
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_hello_word_HellowordActivity */ #ifndef _Included_com_hello_word_HellowordActivity
    #define _Included_com_hello_word_HellowordActivity
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
    * Class: com_hello_word_HellowordActivity
    * Method: sayHelloWord
    * Signature: ()Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHelloWord
    (JNIEnv *, jclass); /*
    * Class: com_hello_word_HellowordActivity
    * Method: sayHello
    * Signature: ()Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHello
    (JNIEnv *, jclass); #ifdef __cplusplus
    }
    #endif
    #endif
  9. helloword.cpp代码,这个文件主要用来实现上述头文件中的接口函数,
    #include <string.h>
    #include <jni.h>
    #include "com_hello_word_HellowordActivity.h"
    #include "com_hello_hello_HelloActivity.h"//注意要引入第三方库的头文件
    /*
     * Class:     com_hello_word_HellowordActivity
     * Method:    sayHello
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHelloWord
      (JNIEnv *env, jclass) {
         //dosomething else
        return env->NewStringUTF("helloword");
    } /*
     * Class:     com_hello_word_HellowordActivity
     * Method:    sayHello
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_com_hello_word_HellowordActivity_sayHello
      (JNIEnv *env, jclass thiz){
        //dosomething else
        return Java_com_hello_hello_HelloActivity_sayHello(env,thiz);//在我们自己的库函数中调用第三方库函数
    }
    jint JNI_OnLoad(JavaVM* vm, void* reserved) {
        JNIEnv* env = NULL;
        jint result = -1;
        if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
            return result;
        }
        return JNI_VERSION_1_4;
    }
    1. 注意引入头文件
    2. 在我们自己的库函数中调用第三方库,可扩展性增大
  10. Adnroid.mk代码,这个代码需要注意
    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE := hello
    LOCAL_SRC_FILES := hello/libhello.so
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/hello/include
    include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
    LOCAL_MODULE := helloword
    LOCAL_SRC_FILES := helloword.cpp
    LOCAL_SHARED_LIBRARIES := libhello
    LOCAL_LDLIBS := -llog
    include $(BUILD_SHARED_LIBRARY)
    1. 运行测试android程序直接调用第三方库方式

       new AlertDialog.Builder( this ).setMessage( new HelloActivity().sayHello()).show();

    2. 运行测试android直接调用自己库方式
       new AlertDialog.Builder( this ).setMessage( sayHelloWord()).show();

    3. 运行测试android直接调用自己库方式,但是我们的库调用了第三方库,在我们的库中对第三方库进行了包装,实现了我们自己的逻辑
       new AlertDialog.Builder( this ).setMessage( sayHello()).show();

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

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

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

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

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

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

  3. Android的JNI调用(一)

    Android提供NDK开发包来提供Android平台的C++开发,用来扩展Android SDK的功能.主要包括Android NDK构建系统和JNI实现与原生代码通信两部分. 一.Android ...

  4. Android的JNI调用(二)

    Android Studio 2.3在native下已经有了代码提示功能,按照提示下载相应组件就可以debug native代码. 一.Java调用JNI与JNI调用Java 1.1 C调用Java ...

  5. Android通过JNI调用驱动程序(完全解析实例)

    要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是 ...

  6. 【转】Android通过JNI调用驱动程序(完全解析实例)

    原文网址:http://blog.csdn.net/ok138ok/article/details/6560875 要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口 ...

  7. (AIDE)Android Eclipse JNI 调用 .so文件加载问题

    背景:对于Android工程 Eclipse里编译好的.so文件放到 libs\armeabi下以后, 这样.so文件就可以打包到apk文件里,在apk装到手机上以后 在libs\armeabi下的. ...

  8. Android于JNI调用列出的程序

    1.安装和下载cygwin,下载Android NDK: 2.于ndk工程JNI接口设计: 3.采用C/C++实现本地方法. 4.JNI生成动态链接库.so档: 5.动态链接库副本javaprojec ...

  9. Java利用JNI调用C/C++写成的DLL

    前言 由于学期作业的要求,笔者需要开发一个语音识别系统.出于对Java的热爱,笔者非常想用Java来写上层程序(前台+数据库的三层),又要用到Microsoft Speech SDK,所以在这些条件下 ...

随机推荐

  1. GIS 相关知识扫盲

    1.什么是GIS GIS:地理信息系统,它是一种特定的十分重要的空间信息系统.它是在计算机硬.软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集.储存.管理.运算.分析 ...

  2. Object-C自定义对象NSLog输入信息

    http://blog.cnrainbird.com/index.php/2012/07/19/object-c_zi_ding_yi_dui_xiang_nslog_shu_ru_you_yong_ ...

  3. 杭电 HDU 4608 I-number

    http://acm.hdu.edu.cn/showproblem.php?pid=4608 听说这个题是比赛的签到题......无语..... 问题:给你一个数x,求比它大的数y. y的要求: 1. ...

  4. A Game with Colored Balls

    题目链接 题意: 给一个长度为n的字符串,每次删除字母同样切连续的串,假设有多个,删除最左边的.最长的串.每次删除输出串的字母,每一个字母的下标(1-n) N (1 ≤ N ≤ 106),串仅仅包含r ...

  5. 模块化的JavaScript

    我们再一次被计算机的名词,概念笼罩. backbone.emberjs.spinejs.batmanjs 等MVC框架侵袭而来. CommonJS.AMD.NodeJS.RequireJS.SeaJS ...

  6. BS常用方法备忘

    在B/S项目开发过程中总结的一些常用方法,如:常量.验证方法.服务器控件方法.html控件方法等. ///******************* 说明 ************************ ...

  7. MD5校验

    好久没有写随笔了,正好这两天可以休整一下,借此机会总结下最近使用python的小体会. 个人体会文件校验在下载文件时使用较多,在linux下最简单的实现方式就是: 1 $ md5sum filenam ...

  8. php 注释

    @access 使用范围:class,function,var,define,module 该标记用于指明关键字的存取权限:private.public或proteced @author 指明作者 @ ...

  9. mysql学习(八)数据表类型-字符集

    数据存储引擎: MyISAM:强化快速读取操作. 也有缺点.一些功能不支持 InnoDB:支持一些MyIASM一些不支持的功能                 缺点:占用空间大 对比          ...

  10. 轻松搞定javascript原型链 _proto_

    //如有错误或不同观点,欢迎批评与讨论! 首先,prototype出现的目的,是为了解决 代码重用 的问题 , prototype 相当于是在内存上划分出一个公共的区域, 专用于存放 实例化对象 的相 ...