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 jstring

JNICALL
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(): 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 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

路径

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值