问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android 怎么把多个so文件编译成jar

发布网友 发布时间:2022-04-22 21:48

我来回答

1个回答

热心网友 时间:2023-07-09 16:48

一共分为2步:

1.在Java中编写要调用的静态方法和需要加载的库,并生成头文件。

2.配置gradle

3.配置Android.mk文件和application.mk文件

下面一步步的走:

首先需要在Java类中声明要调用的方法,以及要加载的库,我们在包下新建一个jniUtil类,如下所示

[plain] view plain copy

public class jniUtil {  

    //要加载的库,生成的库格式为:lib+库名.so  

 static{ System.loadLibrary("hello-jni"); }  

    //要调用的本地方法,在c文件中该方法名称格式为:java_包名_类名_方法名  

 public static native String stringFromJNI();  

}  


注意:在编译时该类中不能有汉字,包括注释,否则会出现编码GBK的不可映射字符错误。
接下来就是利用external Tools生成头文件.h,这里可参考点击打开链接
然后就会在main目录下生成Jni文件夹,并且包含.h文件。下面就是编写C文件,或者可以拷贝已经写好的C文件放置在该jni文件夹中.

2.配置gradle
我们这里不用gradle 去编译,而是只让他去加载已经生成的so库,改用android.mk 去编译(稍后配置android.mk)
在app的build.gradle 下的android 标签下添加:

[plain] view plain copy

sourceSets {  

        main {  

            jni.srcDirs = []//禁止gradle 自动编译,使用已经编译好的So库  

            jniLibs.srcDirs = ['src/main/jniLibs','libs']//指向要使用的库文件//的路径,前边的是自己项目的,后边的是第三方的so  

        }  

    }  


从上面可以看出,我们生成的库是放在
src/main/jniLibs
目录下面的,那么这个是如何配置呢?还是在该gradle下面配置ndk的编译脚本,注意放在android标签外面:

[plain] view plain copy

tasks.withType(JavaCompile) {  

    compileTask -> compileTask.dependsOn CopyToJniLibs  

}  

task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {  

    Properties properties = new Properties()  

    properties.load(project.rootProject.file('local.properties').newDataInputStream())  

    def ndkDir = properties.getProperty('ndk.dir')  

    commandLine "$ndkDir/ndk-build.cmd", "NDK_PROJECT_PATH=$projectDir.absolutePath\\build", "APP_BUILD_SCRIPT=$projectDir.absolutePath\\src\\main\\jni\\Android.mk", "NDK_APPLICATION_MK=$projectDir.absolutePath\\src\\main\\jni\\Application.mk"  

    //你自己的mk文件目录  

}  


在ndkbuild完成后把生成的so文件复制到jniLibs,这里和上面配置的加载so文件路径要一致哦


[plain] view plain copy

task CopyToJniLibs(type: Copy, dependsOn: 'ndkBuild', description: 'copy the native libs to jniLibs') {  

    from fileTree(dir: file(buildDir.absolutePath + '/libs'), include: '**/*.so')  

    into file('src/main/jniLibs')  

}  


新建Android.mk和application.mk,这里我把Android.mk和application.mk放在jni文件夹下了,具体可以自己修改。默认生成的SO文件会在build下面的libs中,我们拷贝出来放到src/main/jniLibs下面。

3.配置Android.mk和Application.mk

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
卡耐基的智慧大全集内容简介 会说话赢天下内容简介 卡耐基演讲与口才内容简介 商务口才训练内容简介 卡耐基金牌口才作者简介 卡耐基商务口才 作者简介 爱因斯坦的更多故事 杨柯叶谨言是什么电视 房贷和消费贷利率差别不大,但是还款金额差别挺大,都是怎么计算的... ...11月18号提现1500元、,11月25号还款1515,请问我还需要还 同学请我吃饭的时候我如果每次都不去的话会怎样呢? build gradle中ndk怎么创建多个modulename 同学请客吃饭不去应该怎么回答? android studio nd开发到底要不要自己配置.mk文件 同学请客吃饭提议应该说些什么 android jni cmake和 mk的不同 同学请客我该怎么办? 如何为Android NDK的gradle构建文件中指定NDK 同学请我去吃饭的时候我如果直接不去的话会怎样呢? 如何提高android.mk的编译速度 感谢同学请客的话 同学请我吃饭的时候我如果直接不去的话会怎样呢? 过生日时,同学之间互相请客你认为这样好吗?请说说你的理由 同学请客吃饭感谢的语言 同学请客吃饭指明只能我一个人去,心里不愉快就借故没去,你怎样看? 怎么让机制饺子皮不变酸不粘皮 饺子馅变酸了怎么办?? 饺子馅有点酸怎么办?‘ 饺子皮过夜就酸了,添加什么好 怎么给苹果手机设置自己喜欢的铃声? 同学请客吃饭的时候,我如果每次大家都去了就我不去的话会怎样呢? 为什么android studio 打包的程序进程不识别 同学请客吃饭就我没去,我要怎么办 如何更新android studio中的ndk 如何处理同学间互相请客吃饭的问题? android studio中怎么打包.so库文件 同学请我帮陪客人吃饭我应怎么做? android bionic 在ndk中吗 帮了一两次小忙,同学老是要请客吃饭怎么办? 应不应该拒绝 android jni abifilters为什么没产生文件 android studio 怎么生成so 现在用androidstudio进行NDK开发成熟吗 迁移一个eclipse工程到AndroidStudio有哪些坑 Android studio 编译的时候gc overhead limit exceeded 如何引用android ndk自带的iconv Android Studio 为什么老是加载不起.so文件? 华为手机CPU构架32位的如何运行只支持64位的游戏? 请问为什么vivoz5x充电的时候现在变成了普通充电而不是闪充呢???_百度... 手机浏览器下载的缓存视频,怎么导出 vivo z5的充电口是什么接口?