Android CMake 编译so库

来源:互联网 发布:stringtokenizer java 编辑:程序博客网 时间:2024/06/04 19:18

环境

  • 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 jstringJNICALLJava_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.AppCompatActivityimport 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(): String    companion 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 JNICALLJava_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 JNICALLJava_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

路径

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为荣耀手机耗电快怎么办 荣耀10手机拍照不清晰怎么办 荣耀6x拍照模糊怎么办 华为荣耀P9进水了怎么办 苹果5s手机信号不好怎么办 苹果5s信号不好怎么办? 苹果5s像素不好怎么办 华为mate边缘有缝怎么办 华为mate8边缘有缝怎么办 手机系统占用运行内存大怎么办 安卓手机储存空间不足怎么办 手机显示系统空间不足怎么办 联系人存储已停止运行怎么办 荣耀note8听筒声音小怎么办 红米4x内存不足怎么办 安卓电视内存小怎么办 红米手机运行内存不足怎么办 红米手机存储空间不足怎么办 华为手机储存空间不足怎么办 大麦机顶盒遥控器丢了怎么办 大麦盒子总自动加软件怎么办 小米手机玩王者荣耀卡怎么办 荣耀8青春版信号差怎么办 华为mate8电池不耐用怎么办 华为4x内存小怎么办 发现手机被用过怎么办 华为p8手机声音小怎么办 手机指纹解锁密码忘了怎么办 华为p10黑色掉漆怎么办 金立手机导航信号弱怎么办 手机导航时gps信号弱怎么办 三星手机导航gps信号弱怎么办 小米5导航信号弱怎么办 华为手机导航gps信号弱怎么办 手机屏玻璃裂了怎么办 oppo音量键坏了怎么办 魅蓝手机屏幕碎了怎么办 手机钢化膜边缘有气泡怎么办 手机贴钢化膜边缘有气泡怎么办 苹果手机钢化膜边缘有气泡怎么办 手机膜里的水泡怎么办