环境

  • 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库相关推荐

  1. Android JNI 编译so库

    环境 Android Studio 3.0 JDK 1.8 Gradle 4.1 Demo地址: https://github.com/seeways/NDKDemo C++编译so库 http:// ...

  2. cmake 编译 linux 库,使用CMake编译跨平台静态库

    在开始介绍如何使用CMake编译跨平台的静态库以前,先讲讲我在没有使用CMake以前所趟过的坑.由于不少开源的程序,好比png,都是自带编译脚本的.咱们可使用下列脚原本进行编译:linux . / c ...

  3. Android系统编译so库提示error undefined reference to '__android_log_print问题的解决

    在系统源代码的hardware/qcom下增加psam文件夹,编译源代码要生成libpsam.so库,Android.mk内容 LOCAL_PATH := $(call my-dir) include ...

  4. 最新版FFmpeg移植Android:编译so库(基于NDK r20和FFmpeg-4.1.0)

    FFmpeg是非常强大的编解码库,支持相当多的格式.如果你仔细看一下手机中各种播放器的许可条款,一定不会缺少FFmpeg的身影. 但是网络上FFmpeg移植的资料都非常少,很多还是使用很老的库,比如使 ...

  5. Android CMake 编译传递宏定义参数

    在做 C++ 需求开发时经常会遇到用宏定义来区分不同版本.不同平台的功能,如下所示: #ifdef DEBUG// 调用 debug 版本方法 #elif RELEASE// 调用 release 版 ...

  6. 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 ...

  7. android ffmpeg编译动态库,最简单的android studio调用ffmpeg动态库

    准备工作: 1.编译好的ffmpeg动态库.so文件,以及ffmpeg的头文件: 2.android studio开发环境,包括NDK等可用环境: 步骤一: 新建一个android studio工程, ...

  8. Android NDK 编译 三方库记录 及 jni库封装问题

    因工作需求, 要将原先的c++库跨平台编译,在Android上运行, 其依赖了几个第三方库, 也需要一起编译, 在此做个记录 所需工具(centos 系统上完成) 1. cmake 3.15.6 2. ...

  9. 【转】Android下编译jni库的二种方法(含示例) -- 不错

    原文网址:http://blog.sina.com.cn/s/blog_3e3fcadd01011384.html 总结如下:两种方法是: 1)使用Android源码中的Make系统 2)使用NDK( ...

最新文章

  1. Quintum 语音网关设置方法
  2. 梯度累加策略对准确率的影响
  3. 实现类似Android联系人搜索功能
  4. java集合基础复习
  5. Linux 常用C函数说明-文件权限控制篇
  6. PAT 1148 Werewolf – Simple Version – 甲级
  7. 只能建立两个虚拟服务器,创建两个虚拟主机
  8. 算法:Valid Parentheses(有效的括号)
  9. 405.数字转换为十六进制数
  10. 解决Maven项目pom文件中出现的错误:“Missing artifact oracle:ojdbc7:jar:12.1.0.2.0:compile“
  11. 莫兰迪配色RGB对照表
  12. love2d 1. 入门
  13. 黑客的成长(学会使用武器)
  14. AAAI 2020 | 清华大学牛人为BabelNet同义词集预测Sememe建立多语言知识库
  15. Windows查看ios手机日志
  16. 腾讯短网址/短链接url.cn生成接口工具推荐
  17. StackFrame
  18. java回收策略_Java 中的垃圾回收策略
  19. 基于JSP的宠物狗交易网站
  20. 【ceph】ceph osd blacklist cep黑名单|MDS问题分析

热门文章

  1. 判断某个数是否满足一定条件
  2. Hibernate(六)一对一映射关系
  3. 深度学习中的规范化(BN、LN等四种规范化)
  4. 索引过长 max key length is 767 bytes
  5. 【计算机网络系列】网络概述与体系结构
  6. 企业内训——如何成为一家高利润的公司
  7. 全球与中国四甲基氢氧化铵市场深度研究分析报告
  8. qq播放器免费的方法
  9. Perl错误处理机制
  10. prefixTreeEspan 频繁子树模式挖掘 A pattern growth 算法实现 mining embedded subtrees.