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


    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


  • 相关阅读:
    MsSql数据库存储过程加密解密
    Delete Exists
    SQL Server 2008数据库日志收缩
    MSSQL PIVOT 实现行列转置
    Oracle中将查询出的多条记录的某个字段拼接成一个字符串的方法
    oracle的分析函数over 及开窗函数
    Asprise-OCR的使用
    【整理】动态加载Web Services
    【转载】Python正则表达式指南
    Mac中PyCharm设置GitHub的步骤
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3212493.html
Copyright © 2020-2023  润新知