【Android】CMake添加多个c文件

本文详细介绍了使用CMake进行Android Native C++开发的过程,包括如何创建工程、编写JNI函数、配置CMakeLists.txt以及在Java层加载和调用C/C++代码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 准备工作

先下相关的插件,进入setting,勾选这LLDB、NDK、CMake三个,点击OK后即可下载
[image:1FF9CCB4-704A-4FEE-B79C-947D678168B5-38535-000200F9E7FB3A7F/3C179A1F-3DBD-4FE1-88B6-758EA442F287.png]

2 Native C++工程

在这里插入图片描述

简单总结一下CMake使用的操作步骤
1、新建Native C++工程
2、新建c或cpp文件,写jni函数,将在java被调用
3、修改CMakeLists.txt文件,指定so名字,将在java被loadLibrary
4、在MainActivity.java中loadLibrary第三步的so和调用第二步的jni函数
5、一句话总结:Native C++ -> c -> txt -> java

注:如果新建的不是Native C++工程(如Empty Activity),则需要在module的build.gradle中,android{}闭包内任意位置添加以下内容:

externalNativeBuild {
    cmake {
        path "src/main/jni或者cpp文件夹/CMakeLists.txt"
        version "3.10.2"
    }
}

工程编译流程:gradle找到txt -> txt指定c和so -> java调用c

3 c和txt文件

新建Native C++工程后直接一路next就可以了,而且可以直接运行了,应该会输出Hello from C++字样

文件夹中多了这么几个内容
在这里插入图片描述
最需要关心的就是CMakeLists.txt这个文件,里面的内容非常多,不过将注释全部删除,可以简化如下:

cmake_minimum_required(VERSION 3.4.1)

add_library(native-lib SHARED native-lib.cpp)

find_library(log-lib log)

target_link_libraries(native-lib ${log-lib})

我们可以先按照流程走一遍:
1、在cpp目录下右键新建一个C/C++ Source File,随便起个名
在这里插入图片描述
由于之前已经起了一个test.cpp测试通过了,所以这次我想试试c,所以新建了一个cxk.c
[image:9420624E-BE36-427F-B55E-175455891083-38535-0001FF629251F3DA/Pasted Graphic 9.jpg]

2、然后输入如下内容,注意红框的地方要改成你自己的包名和文件名,
[image:B06FB579-4273-4BB4-9DC5-F6F22D79A7A4-38535-000207F280AC9E98/5E80CD1C-ACD6-42AC-8C0D-D2F39FA05506.png]

#include <jni.h>

JNIEXPORT jstring JNICALL Java_你的包名_MainActivity_get2
    (JNIEnv *env,jobject obj)
    {
    return (*env)->NewStringUTF(env,"Hello from C , chicken you so beautiful !");
}

其他有标红的地方不管。

注意c和c++的语法是不一样的,注意区别,可参考
https://blog.youkuaiyun.com/u011068702/article/details/71425585

3、在CMakeLists.txt中增加如下内容

add_library(MyLib2 SHARED cxk.c)

完整代码如下(已删除原有注释):
[image:86DAA089-472E-4A5A-9BE3-596B71F8670D-38535-0001FF629273A796/Pasted Graphic 11.jpg]

4、然后到MainActivity.java中加入如下三行代码
[image:C41DC353-2986-4A17-9FC1-9516041C4686-38535-0001FF629280750A/Pasted Graphic 14.jpg]
完整代码如下:

package com.a.san;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
        System.loadLibrary("MyLib");
        System.loadLibrary("MyLib2");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
        TextView tv = findViewById(R.id.sample_text);
        tv.setText(get2());

    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
    public native String get();
    public native String get2();
}


5、此时再点击右上角的Sync刷新,即可发现标红的地方都没了
然后运行看看!
[image:910C3A49-D593-49A3-84D5-9A6D0567CA51-38535-000209C682FA248E/D70E5B9E-96F6-4972-BD23-5727DBFDB7F9.png]
/app/build/intermediates/cmake/debug/obj/armeabi-v7a/目录下有我们在txt文件中指定的so文件名称,如下:
[image:EA722236-07A0-4FD6-B70E-94F01FE23A75-38535-00020C34AF72B21F/F06500B5-C384-4F2E-96F0-87EB448A3DB2.png]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值