栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

Android编译C/C++代码,编译出的so文件给别的项目用,CMakeLists.txt编译,请放弃Android.mk!

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android编译C/C++代码,编译出的so文件给别的项目用,CMakeLists.txt编译,请放弃Android.mk!

现在手机主流CPU架构一般是2种:

32位对应-armeabi-v7a

64位对应-arm64-v8a

下面进入正题,Android Studio版本是4开头的,具体多少没显示....

 1,首先在AS里面下载好NDK和CMAKE,如下图:

2,用AS新建一个支持Native C++的项目,如果新建完项目,等build完成可以直接跑起来,说明你环境没问题,完全可以玩起来,新版本的AS都不用配置NDK目录啥的,这很智能,旧版的同学赶紧升级吧。

3,下面是我自己新建的项目,我们修改下AS自建的代码,达成演示的效果,

目标是java传入2个整数,通过C++或C代码计算和。

 

 C代码如下,C的方法命名规则是Java_包名_类名_方法名:

//
// Created by 13746 on 2022/8/8.
//

#include 

JNIEXPORT jint JNICALL Java_com_example_nativedemo_NumNative_getSumFromC(
        JNIEnv* env,
        jobject obj,
        jint age,
        jint high
) {
    return age+high;
}

native方法加载so 和java调用:

package com.example.nativedemo;

public class NumNative {

    static {
        System.loadLibrary("num");
    }

    public native int getSumFromC(int age,int high);

}
package com.example.nativedemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import com.example.nativedemo.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {


    private ActivityMainBinding binding;

    private NumNative numNative;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        TextView tv = binding.sampleText;

        numNative = new NumNative();

        int sumFromC = numNative.getSumFromC(100, 203);

        tv.setText("获取到结果:"+sumFromC);
    }


}

运行结果:

上面是C源文件经过编译后直接运行的,那么打包出来的so文件在哪,别的项目怎么使用这个so文件呢?下面具体说说。

生成的so文件目录如下拷贝出来就可以给别人使用了:

下面是别的项目使用这个so文件运行结果,写的类NativeNum必须要和生成so文件包名相同。

使用的项目里面build文件里面需要设置如下,但是编译的项目不能设置,否则会报错

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

NumNative类合Main

package com.example.nativedemo;

public class NumNative {

    static {
        //此处加载so文件不要带有前缀lib,和后缀名 .so,系统自动加
        System.loadLibrary("num");
    }

    public native int getSumFromC(int age,int high);

}
package com.example.nativedemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private NumNative numNative;

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

        numNative = new NumNative();

        TextView sum = findViewById(R.id.mainSum);

        int sumFromC = numNative.getSumFromC(33, 180);
        sum.setText("获取的结果:"+sumFromC);
    }

}

​​​​​​​

下面是2个项目的完整代码地址:

晚点上传

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039254.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号