Android studio .a静态库的生成与调用 简单 需要把厂家提供的C语言写的.a库 再封装成.so库,再通过jni 映射给JAVA调用 .so库调用,可以多个.a库 NDK编译 javah

  三、调用.a库 还可以再封装 简单

 新建一个c++示例工程,复制libs和和头文件到cpp下一张图说明

 一张图说明调用 

 四、生成.so库a.库

使用示例项目,全部默认回车,编译。

编译或者执行build     make project 即可生成.so库

 生成.a静态库,要改点内容

calc.cpp放在cpp下 

#include <jni.h>
#include "include/calc.h"
int add(int a , int b){
    return a + b;
}

calc.h放在cpp/include下 

#ifndef MY_APPLICATION_CALC_H
#define MY_APPLICATION_CALC_H
int add(int a , int b);
#endif //MY_APPLICATION_CALC_H

 打开CMakeLists.txt文件,将add_library下的SAHRED改为STATIC,将native-lib.cpp删掉 ,加上自己的calc.cpp

在加入build.gradle(Moudle:app)(不设这个还不行)

        externalNativeBuild {
            cmake {
                arguments '-DANDROID_PLATFORM=android-14',
                        '-DANDROID_TOOLCHAIN=clang'
                targets 'native-lib'   //看cmakelists里的模块名字

                cppFlags ""
            }
        }


执行build          make project

生成的文件位置

 下面也有用ndk-build方法来生成.so库或.a库。

后面就不用看了。我走过的弯路。

涉及安全,需要把厂家提供的C语言写的.a库 再封装成.so库,再通过jni 映射给JAVA调用。

进入这里运行ndk-build

 

 这还没加jni,下面加上jni

java10,java11删除了javah。改用javac直接用源码生成jni头文件,

javac -h  目录  源码文件

cd 目录下
javac -h .\  FTPosNatives.java

 

 

 

代码放在项目中编译生成.class文件(javac好像不行)

package com.example.chenhao3;
public class Dx{
    public native int getdx81id();
    public native int test();
}

 javah生成c语言头文件 在当前目录下

javah -classpath C:\Users\wuqimei\AndroidStudioProjects\Chenhao3\app\build\intermediates\javac\debug\classes -jni com.example.chenhao3.Dx

生成的头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_chenhao3_Dx */

#ifndef _Included_com_example_chenhao3_Dx
#define _Included_com_example_chenhao3_Dx
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_chenhao3_Dx
 * Method:    getdx81id
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_example_chenhao3_Dx_getdx81id
  (JNIEnv *, jobject);

/*
 * Class:     com_example_chenhao3_Dx
 * Method:    test
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_example_chenhao3_Dx_test
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

方法实现也写上JNIcom_example_chenhao3_Dx.c 

#include <jni.h>

#include "com_example_chenhao3_Dx.h"
#include "demo.h"

JNIEXPORT jint JNICALL Java_com_example_chenhao3_Dx_getdx81id(JNIEnv *env, jobject thiz){
    return getdx81id();
}

JNIEXPORT jint JNICALL Java_com_example_chenhao3_Dx_test(JNIEnv *env, jobject thiz){
    return test();
}


 再加入.c到android.mk后,重新编译ndk-build

.so库二次封装成功了。

二、  .so库调用

 1.复制libs目录到项目下,并把目录设为jni,如图

    sourceSets{
        main{
            jniLibs.srcDirs = ['libs']
        }
    }

 

 Dx.java加到项目,注意包名不能改,并在Dx.java文件加入。再调用。

 问题1:运行提示

问题2:同步了下。用真机又报这个错

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.chenhao2, PID: 6516
    java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__read_chk" referenced by "libdemo.so"...
        at java.lang.Runtime.loadLibrary(Runtime.java:365)
        at java.lang.System.loadLibrary(System.java:526)
        at com.example.chenhao3.Dx.<clinit>(Dx.java:5)

??????

问题3:缺x86,x86_64 这两个CPU架构

我试了,调用默认c++示例.so库是正常的,它另外带有x86,x86_64 这两个CPU架构,删了也报同样的错误 。没有使用再封装也是正常的。

说明方法是对的,只是少对应cpu架构库。所有cpu加上,x86,x86_64 报错

使用静态试试,改成static,静态x86,x86_64能编译成功。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android libcurl.a是一个静态库,它是用C语言的libcurl网络传输编译结果。静态库是一种在编译时被链接到应用程序中的,通过将的对象代码直接嵌入到应用程序中,从而使应用程序可以在没有其他外部依赖项的情况下独立运行。 静态库的使用方式是将其与应用程序进行链接,这样应用程序就可以使用静态库中定义的函数和变量。在Android开发中,可以使用Android Studio等工具将libcurl.a添加到项目中,并在项目配置中进行链接设置。 使用Android libcurl.a静态库可以为Android应用程序提供强大而灵活的网络传输功能。libcurl支持多种协议,包括HTTP、HTTPS、FTP等,并提供了一系列功能来方便地进行网络通信,例如数据传输、下载、上传等。通过使用libcurlAndroid应用程序可以方便地与网络资源进行交互,并实现各种功能,如下载文件、上传数据等。 静态库的一个优点是在编译时能够减少应用程序的体积,因为的代码嵌入到应用程序中,不需要在运行时再次加载。同时,静态库的使用也可以提高应用程序的性能,因为的代码可以被编译器优化,以达到更好的执行效率。 总之,Android libcurl.a静态库是一个有用的工具,可以为开发Android应用程序提供强大的网络传输功能,通过与应用程序进行链接,实现各种网络通信需求,同时也能减少应用程序的体积和提升性能。 ### 回答2: Android libcurl.a是一个静态库,它是CurlAndroid平台上的编译结果。Curl是一个开源的网络传输工具,支持多种协议(包括HTTP、FTP、Telnet等)和一些常见的功能(如文件上传、下载等)。 libcurl.a的静态库形式可以将Curl的功能和代码整合到一个独立的二进制文件中,这意味着在编译时会将Curl中的函数和依赖项静态链接到应用程序中。 使用libcurl.a的静态库可以使开发者在编译阶段直接将Curl的功能包含到应用程序中,不再需要运行时加载动态文件。这样可以减少应用程序的体积并提升性能,但也意味着更新Curl需要重新编译应用程序。 要在Android项目中使用libcurl.a,可以将静态库文件复制到项目的jni目录下,然后在JNI层的C/C++代码中引用该。具体步骤包括在Android.mk中添加libcurl.a的编译指令,并在代码中使用#include导入相关的Curl头文件。然后可以在应用程序中使用Curl提供的功能,如发送HTTP请求等。 总之,Android libcurl.a是一个静态库,可以将Curl的功能整合到Android应用程序中,帮助开发者在应用层面进行网络传输和其他网络相关操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值