Android CMake 编译so库
环境
- Android Studio 3.0
- JDK 1.8
- Gradle 4.1
Demo地址:
https://github.com/seeways/NDKDemo
C++编译so库
创建项目
使用默认的C++支持库建立项目后,会默认生成一个模板,有一个简单的Cpp程序,和MainActivity调用示例
c++
#include <jni.h>
#include <string>extern "C"
JNIEXPORT jstringJNICALL
Java_com_test_ndkdemo_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());
}
java
//包名
package com.test.ndkdemo//导入的包
import android.support.v7.app.AppCompatActivity
import android.os.Bundle//kotlin插件
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 调用示例sample_text.text = stringFromJNI()}//一个本地方法,它由“本地库”本地库实现,它被打包在这个应用程序中。external fun stringFromJNI(): Stringcompanion object {// 用于在应用程序启动时加载“native-lib”库//相当于java的静态代码块。init {System.loadLibrary("native-lib")}}
}
以上是项目建立好之后的默认程序,C++没有像java一样的保姆,所以一般调用完了需要自己释放内存,比如要用到数据的话,一定要释放,否则估计几个回合程序就挂了。
接下来稍微改造一下程序
建立JNI类
package com.test.ndkdemo;/*** Created by TaoYuan on 2017/11/24 0024.*/public class MyJNI {//调用so库声明static {System.loadLibrary("MyJNI");}/*** 调用so库方法*///输出字符串public native String sayHello();//输出 x + y 计算结果public native int sum(int x, int y);}
简历C++文件
#include <jni.h>
#include <string>extern "C"
JNIEXPORT jstring JNICALL
Java_com_test_ndkdemo_MyJNI_sayHello(JNIEnv *env, jobject instance) {std::string say = "say 就 say!\n Hello";return env->NewStringUTF(say.c_str());
}extern "C" //表示对java输出
JNIEXPORT jint JNICALL
Java_com_test_ndkdemo_MyJNI_sum(JNIEnv *env, jobject instance, jint x, jint y) {return x + y;
}
CMakeLists.txt文件(关键地方)
# 指定需要CMAKE的最小版本
cmake_minimum_required(VERSION 3.4.1)# 添加库,参数为(库名称<自定义>,库模式<STATIC,SHARED>,路径)
add_library( # Sets the name of the library.MyJNI# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).src/main/cpp/MyJNI.cpp )# 指定目标库
target_link_libraries( # Specifies the target library.MyJNI# Links the target library to the log library# included in the NDK.${log-lib} )
modules build.gradle
android代码块下,加一句:
abiFilters 类型
externalNativeBuild {cmake {cppFlags ""abiFilters 'armeabi','armeabi-v7a'}}
完成
make project即可生成
生成路径位于:${ProjectPath}\app\build\intermediates\cmake\debug\obj
Android CMake 编译so库相关推荐
- Android JNI 编译so库
环境 Android Studio 3.0 JDK 1.8 Gradle 4.1 Demo地址: https://github.com/seeways/NDKDemo C++编译so库 http:// ...
- cmake 编译 linux 库,使用CMake编译跨平台静态库
在开始介绍如何使用CMake编译跨平台的静态库以前,先讲讲我在没有使用CMake以前所趟过的坑.由于不少开源的程序,好比png,都是自带编译脚本的.咱们可使用下列脚原本进行编译:linux . / c ...
- Android系统编译so库提示error undefined reference to '__android_log_print问题的解决
在系统源代码的hardware/qcom下增加psam文件夹,编译源代码要生成libpsam.so库,Android.mk内容 LOCAL_PATH := $(call my-dir) include ...
- 最新版FFmpeg移植Android:编译so库(基于NDK r20和FFmpeg-4.1.0)
FFmpeg是非常强大的编解码库,支持相当多的格式.如果你仔细看一下手机中各种播放器的许可条款,一定不会缺少FFmpeg的身影. 但是网络上FFmpeg移植的资料都非常少,很多还是使用很老的库,比如使 ...
- Android CMake 编译传递宏定义参数
在做 C++ 需求开发时经常会遇到用宏定义来区分不同版本.不同平台的功能,如下所示: #ifdef DEBUG// 调用 debug 版本方法 #elif RELEASE// 调用 release 版 ...
- cmake编译clBLAS库出现The LOCATION property should not be read from target test-correctness. Use the t
解决方法 cmake编译带上参数进行编译: cmake -/src -DBUILD_TEST=False 错误: -- You have confirmed OpenCL 1.2 is support ...
- android ffmpeg编译动态库,最简单的android studio调用ffmpeg动态库
准备工作: 1.编译好的ffmpeg动态库.so文件,以及ffmpeg的头文件: 2.android studio开发环境,包括NDK等可用环境: 步骤一: 新建一个android studio工程, ...
- Android NDK 编译 三方库记录 及 jni库封装问题
因工作需求, 要将原先的c++库跨平台编译,在Android上运行, 其依赖了几个第三方库, 也需要一起编译, 在此做个记录 所需工具(centos 系统上完成) 1. cmake 3.15.6 2. ...
- 【转】Android下编译jni库的二种方法(含示例) -- 不错
原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是: 1)使用Android源码中的Make系统 2)使用NDK( ...
最新文章
- Quintum 语音网关设置方法
- 梯度累加策略对准确率的影响
- 实现类似Android联系人搜索功能
- java集合基础复习
- Linux 常用C函数说明-文件权限控制篇
- PAT 1148 Werewolf – Simple Version – 甲级
- 只能建立两个虚拟服务器,创建两个虚拟主机
- 算法:Valid Parentheses(有效的括号)
- 405.数字转换为十六进制数
- 解决Maven项目pom文件中出现的错误:“Missing artifact oracle:ojdbc7:jar:12.1.0.2.0:compile“
- 莫兰迪配色RGB对照表
- love2d 1. 入门
- 黑客的成长(学会使用武器)
- AAAI 2020 | 清华大学牛人为BabelNet同义词集预测Sememe建立多语言知识库
- Windows查看ios手机日志
- 腾讯短网址/短链接url.cn生成接口工具推荐
- StackFrame
- java回收策略_Java 中的垃圾回收策略
- 基于JSP的宠物狗交易网站
- 【ceph】ceph osd blacklist cep黑名单|MDS问题分析