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

0:前言:

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

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

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

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

[第四篇:android调用第三方库——调用多个第三方库的写法]

1:搞起:

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

    1. 运行测试android程序直接调用第三方库方式
      [html]  view plain  copy
      1. new AlertDialog.Builder( this ).setMessage( new HelloActivity().sayHello()).show();  
    2. 运行测试android直接调用自己库方式
      [html]  view plain  copy
      1. new AlertDialog.Builder( this ).setMessage( sayHelloWord()).show();  
    3. 运行测试android直接调用自己库方式,但是我们的库调用了第三方库,在我们的库中对第三方库进行了包装,实现了我们自己的逻辑
      [html]  view plain  copy
      1. new AlertDialog.Builder( this ).setMessage( sayHello()).show();  







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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值