CMake生成多个.so文件
用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文件相关推荐
- linux c url下载文件,OpenCV教程之使用cmake生成MakeFile时下载文件
在编译OpenCV以及其附加模块时,有时会需要一些第三方的库,如果本地没有,会自动下载,下载地址一般为GitHub,结果当然就是卡死在那里,根本无法下载,下面教大家如何解决这种问题. 问题重现 比如我 ...
- cmake导入so库_通过CMake方式生成动态库so文件
JNITest 通过CMake方式生成动态库so文件 简介 Java JNI的本意是Java Native Interface(Java本地接口),它是为了方便Java调用C.C++等本地代码所封装的 ...
- Cmake知识----编写CMakeLists.txt文件编译C/C++程序
1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...
- cmake重新编译matlab,ubuntu系统下cmake 编译matlab中mex文件
cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此.利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,并且要按照依赖关系排 cmake 编译工程具有独特的优势 ...
- 使用CMake生成sln项目和VS工程遇到的问题
2019独角兽企业重金招聘Python工程师标准>>> 用vs运行cmake后的工程 参考:http://zhidao.baidu.com/link?url=AZRxI0jGDzo6 ...
- [转]CMake 生成makefile 步骤
1.首先创建一个目录下的makefile //main.cpp#include<iostream>using namespace std;int main(){ cout<<& ...
- 使用Cmake生成跨平台项目编译解决方案
项目最近有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步维护 ...
- CMake 常用总结二:CMake 生成静态库与动态库
引言 CMake 实践帮助我们对 CMake 有一个系统全面的了解,并且有大量示例以供参考,至少在实际项目中可以让我们有能力看懂并修改项目中现有的 CMake . 阅读完 CMake 实践文档,认为自 ...
- 编译Gmsh,生成dll和lib文件,在自建程序中使用Gmsh函数
本文参考了CAD大神潇湘散人的Gmsh编译博客:使用VS2015编译gmsh4.8 with opencascade7.4,并用gmsh.lib创建简单工程测试网格_XXM的博客-CSDN博客在编译过 ...
最新文章
- 【学习笔记】出货认证(QM模块)
- 写一个ajax程序就是如此简单
- 文件锁操作《精通Unix下C语言编程与项目实践》之三
- sql2000 mysql 兼容_SQL Server2000如何恢复数据库
- leetcode —— 216. 组合总和 III
- 打印任意想要的菱形,例如3行的、9行的、13行的菱形
- NYOJ-数独(dfs)
- Java反编译工具推荐 -- DJ Java Decompiler
- linux中快速清空文件内容的方法
- oppoJava面试!java开发视频聊天
- 惠斯通电桥信号调理芯片_变频器通电后无反应,如何检查维修?
- 2021牛客暑期多校训练营10,签到题FH
- 怎么用java做todolist_[Java教程]JavaScript jQuery 任务清单 ToDoList
- Linux系统升级硬盘后HOME分区扩容操作流程
- sqlserver 当月、 时间_sqlserver 获取时间年月日时分秒
- 2015最新Linkedin人才趋势报告
- VBB 3.8.4 XSS
- Kolmogorov 的数学观与业绩
- 迅雷极速版|xunlei下载
- 微信小程序 多标签选择和添加标签
热门文章
- 如何将数据库中text字段中返回的数据转换成数组的形式,并且将字符串的数字转换成数字的形式显示
- 将html字符串转换成html标签显示到页面上(转)
- DVWA环境搭建教程-手把手最详细介绍
- c语言中0x12是什么进制,C语言中进制知识汇总
- 《进化心理学》《伊斯坦布尔假期》
- RabbitMq中的mandatory
- STM32CubeIDE移植标准库
- 实现文件导出功能(Excel文件形式):全部导出
- 截流式合流制设计流量计算_[2018年最新整理]合流制排水管网设计与计算.ppt
- 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结