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. 结构如图[置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
  4. src目录下有两个包,分别是
    com.hello.hellocom.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 __cplusplusextern "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.soLOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/hello/includeinclude $(PREBUILT_SHARED_LIBRARY)  include $(CLEAR_VARS)LOCAL_MODULE    := hellowordLOCAL_SRC_FILES := helloword.cppLOCAL_SHARED_LIBRARIES := libhelloLOCAL_LDLIBS := -lloginclude $(BUILD_SHARED_LIBRARY)

    1. 运行测试android程序直接调用第三方库方式
       new AlertDialog.Builder( this ).setMessage( new HelloActivity().sayHello()).show();
      [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
    2. 运行测试android直接调用自己库方式
       new AlertDialog.Builder( this ).setMessage( sayHelloWord()).show();
      [置顶] android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
    3. 运行测试android直接调用自己库方式,但是我们的库调用了第三方库,在我们的库中对第三方库进行了包装,实现了我们自己的逻辑
       new AlertDialog.Builder( this ).setMessage( sayHello()).show();

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





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


更多相关文章

  1. 创建可访问的Android应用程序:辅助技术
  2. Android碎碎念 -- 性能测试,适用于Android Studio的代码审查和性
  3. Android 当打开“开发者模式”中的“不保留活动”后,程序应当怎么
  4. 对系统学习与写博客的看法——学完《第一行代码》有感
  5. 【Android】使用Intent调用系统其它程序,使用onKeyDown对音量键的
  6. Android开发——纯JAVA代码方式界面设计

随机推荐

  1. redis之通信协议
  2. Java线程之概念与原理
  3. Java 死锁范例以及如何分析死锁
  4. redis之复制
  5. Java线程之创建与启动
  6. 算法:有向无环图的最短路径
  7. 配置DNS服务和编译安装MariaDB
  8. 10 个有关 String 的面试问题
  9. Java线程之线程状态的转换
  10. Unity 阴影