用CMake来编译生成多个.so文件流程:
1、SDK Manager下载配置好CMake LLDB NDK这个就不需要详细讲了
2、配置完毕后重启一下,然后在app目录下面添加一个CMakeList.txt文件

#CMake的最小版本
cmake_minimum_required(VERSION 3.4.1)

#设置生成的so动态库最后输出的路径,这个下面会讲这么用
#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
#生成多个就继续写add_library,仿造下面的去写就ok
add_library( # 生成的.so文件的名称,第一个.so

one

# Sets the library as a shared library.
             SHARED

# 提供的c++文件
             src/main/cpp/one.cpp )

add_library( # 生成的.so文件的名称,第二个.so
              two

# Sets the library as a shared library.
               SHARED

# 提供的c++文件
               src/main/cpp/two.cpp )

find_library( # Sets the name of the path variable.打印的.so文件
              log-lib
              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

target_link_libraries( # Specifies the target library.与log库绑定
                       native-lib

# Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
target_link_libraries( # Specifies the target library.与log库绑定
                       myself-lib

# Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

3、在app的build.gradle中添加,主要是用来引入CmakeList.txt配置文件

android {
.....
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }

.....
    }
   
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

4、当然你也还需要在local.properties中添加你的ndk位置,有些会自动帮你添加,自己检查一下最好
ndk.dir=G\:\\androidstudioSdkLocation\\ndk-bundle
sdk.dir=G\:\\androidstudioSdkLocation

5、以下是我的app的工程目录结构图

(1)新建的cpp文件是用来放我们的c++文件,当然里面定义的方法适合下面的GetString和GetDataFromJni关联起来的。

GetString.java

public class GetString {static {System.loadLibrary("one");}public static native String getStr();
}

GetDataFromJni.java

public class GetDataFromJni {static {System.loadLibrary("two");}public static native String getData();public static native int addData(int x,int y);public static native String addString(String string);
}

one.cpp:

#include <jni.h>
#include <string>
extern "C"/** Class:     liuqinbin_com_jniproject_GetString* Method:    getStr* Signature: ()Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_liuqinbin_com_jniproject_GetString_getStr(JNIEnv *env, jclass){std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());}

two.cpp

#include <jni.h>
#include <string>extern "C"
/** Class:     liuqinbin_com_jniproject_GetDataFromJni* Method:    getData* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_liuqinbin_com_jniproject_GetDataFromJni_getData(JNIEnv *env, jclass clazz){std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}/** Class:     liuqinbin_com_jniproject_GetDataFromJni* Method:    addData* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_liuqinbin_com_jniproject_GetDataFromJni_addData(JNIEnv *evn, jclass clazz, jint x, jint y){return x+y;}/** Class:     liuqinbin_com_jniproject_GetDataFromJni* Method:    addString* Signature: (Ljava/lang/String;)Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_liuqinbin_com_jniproject_GetDataFromJni_addString(JNIEnv *, jclass, jstring string){return string;}

6、然后make project一下就可以了,之后可以在build下面看我们编译出来的.so文件

7、到这里也差不了我们的工作,之后再你需要的地方调用方法就ok了

public class MainActivity extends AppCompatActivity {private TextView tv;private TextView tv2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv2 = (TextView)findViewById(R.id.tv2);tv = (TextView)findViewById(R.id.tv);tv2.setText(GetString.getStr());//在one.cpp中有对应的方法tv.setText(GetDataFromJni.getData());//在two.cpp中有对应的方法}
}

后续:

如果你想要在你的app目录下面看到输出的.so文件,这个时候你CmakeList.txt文件只要去掉下面一行代码的#号,这个时候会生成你需要的.so

文件在你的目录下面。

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

这个时候会生成你的.so,不过你不能去clean project,因为你会让你的工程apk的.so被清除。

这次写有点匆忙,而且没有用MarkDown,下次好好学一下MarkDown.有需要的可以联系wx:liu_qin_bin

CMake生成多个.so文件相关推荐

  1. linux c url下载文件,OpenCV教程之使用cmake生成MakeFile时下载文件

    在编译OpenCV以及其附加模块时,有时会需要一些第三方的库,如果本地没有,会自动下载,下载地址一般为GitHub,结果当然就是卡死在那里,根本无法下载,下面教大家如何解决这种问题. 问题重现 比如我 ...

  2. cmake导入so库_通过CMake方式生成动态库so文件

    JNITest 通过CMake方式生成动态库so文件 简介 Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的 ...

  3. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  4. cmake重新编译matlab,ubuntu系统下cmake 编译matlab中mex文件

    cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此.利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,并且要按照依赖关系排 cmake 编译工程具有独特的优势 ...

  5. 使用CMake生成sln项目和VS工程遇到的问题

    2019独角兽企业重金招聘Python工程师标准>>> 用vs运行cmake后的工程 参考:http://zhidao.baidu.com/link?url=AZRxI0jGDzo6 ...

  6. [转]CMake 生成makefile 步骤

    1.首先创建一个目录下的makefile //main.cpp#include<iostream>using namespace std;int main(){ cout<<& ...

  7. 使用Cmake生成跨平台项目编译解决方案

    项目最近有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步维护 ...

  8. CMake 常用总结二:CMake 生成静态库与动态库

    引言 CMake 实践帮助我们对 CMake 有一个系统全面的了解,并且有大量示例以供参考,至少在实际项目中可以让我们有能力看懂并修改项目中现有的 CMake . 阅读完 CMake 实践文档,认为自 ...

  9. 编译Gmsh,生成dll和lib文件,在自建程序中使用Gmsh函数

    本文参考了CAD大神潇湘散人的Gmsh编译博客:使用VS2015编译gmsh4.8 with opencascade7.4,并用gmsh.lib创建简单工程测试网格_XXM的博客-CSDN博客在编译过 ...

最新文章

  1. 【学习笔记】出货认证(QM模块)
  2. 写一个ajax程序就是如此简单
  3. 文件锁操作《精通Unix下C语言编程与项目实践》之三
  4. sql2000 mysql 兼容_SQL Server2000如何恢复数据库
  5. leetcode —— 216. 组合总和 III
  6. 打印任意想要的菱形,例如3行的、9行的、13行的菱形
  7. NYOJ-数独(dfs)
  8. Java反编译工具推荐 -- DJ Java Decompiler
  9. linux中快速清空文件内容的方法
  10. oppoJava面试!java开发视频聊天
  11. 惠斯通电桥信号调理芯片_变频器通电后无反应,如何检查维修?
  12. 2021牛客暑期多校训练营10,签到题FH
  13. 怎么用java做todolist_[Java教程]JavaScript jQuery 任务清单 ToDoList
  14. Linux系统升级硬盘后HOME分区扩容操作流程
  15. sqlserver 当月、 时间_sqlserver 获取时间年月日时分秒
  16. 2015最新Linkedin人才趋势报告
  17. VBB 3.8.4 XSS
  18. Kolmogorov 的数学观与业绩
  19. 迅雷极速版|xunlei下载
  20. 微信小程序 多标签选择和添加标签

热门文章

  1. 如何将数据库中text字段中返回的数据转换成数组的形式,并且将字符串的数字转换成数字的形式显示
  2. 将html字符串转换成html标签显示到页面上(转)
  3. DVWA环境搭建教程-手把手最详细介绍
  4. c语言中0x12是什么进制,C语言中进制知识汇总
  5. 《进化心理学》《伊斯坦布尔假期》
  6. RabbitMq中的mandatory
  7. STM32CubeIDE移植标准库
  8. 实现文件导出功能(Excel文件形式):全部导出
  9. 截流式合流制设计流量计算_[2018年最新整理]合流制排水管网设计与计算.ppt
  10. 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结