• 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_包名_类名_方法名:

    1. //
    2. // Created by 13746 on 2022/8/8.
    3. //
    4. #include
    5. JNIEXPORT jint JNICALL Java_com_example_nativedemo_NumNative_getSumFromC(
    6. JNIEnv* env,
    7. jobject obj,
    8. jint age,
    9. jint high
    10. ) {
    11. return age+high;
    12. }

    native方法加载so 和java调用:

    1. package com.example.nativedemo;
    2. public class NumNative {
    3. static {
    4. System.loadLibrary("num");
    5. }
    6. public native int getSumFromC(int age,int high);
    7. }
    1. package com.example.nativedemo;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. import android.widget.TextView;
    5. import com.example.nativedemo.databinding.ActivityMainBinding;
    6. public class MainActivity extends AppCompatActivity {
    7. private ActivityMainBinding binding;
    8. private NumNative numNative;
    9. @Override
    10. protected void onCreate(Bundle savedInstanceState) {
    11. super.onCreate(savedInstanceState);
    12. binding = ActivityMainBinding.inflate(getLayoutInflater());
    13. setContentView(binding.getRoot());
    14. TextView tv = binding.sampleText;
    15. numNative = new NumNative();
    16. int sumFromC = numNative.getSumFromC(100, 203);
    17. tv.setText("获取到结果:"+sumFromC);
    18. }
    19. }

    运行结果:

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

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

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

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

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

    NumNative类合Main

    1. package com.example.nativedemo;
    2. public class NumNative {
    3. static {
    4. //此处加载so文件不要带有前缀lib,和后缀名 .so,系统自动加
    5. System.loadLibrary("num");
    6. }
    7. public native int getSumFromC(int age,int high);
    8. }
    1. package com.example.nativedemo;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. import android.widget.TextView;
    5. public class MainActivity extends AppCompatActivity {
    6. private NumNative numNative;
    7. @Override
    8. protected void onCreate(Bundle savedInstanceState) {
    9. super.onCreate(savedInstanceState);
    10. setContentView(R.layout.activity_main);
    11. numNative = new NumNative();
    12. TextView sum = findViewById(R.id.mainSum);
    13. int sumFromC = numNative.getSumFromC(33, 180);
    14. sum.setText("获取的结果:"+sumFromC);
    15. }
    16. }

    ​​​​​​​

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

    晚点上传

  • 相关阅读:
    开源IPTV源服务程序使用教程
    JSTL标签库和EL表达式
    Elasticsearch:使用向量化和 FFI/madvise 加速 Lucene
    SpringBoot 时 jar 报错 没有主清单属性
    华为ac怎么配置 写个配置
    PAT 1023 Have Fun with Numbers(高精度乘法)
    Linux-7-文件系统
    Apache Doris以Routine Load方式流式的导入Kafka数据
    视频监控管理平台EasyCVR自动注销后,页面还存留播放窗口是什么原因?解决办法是什么?
    算法竞赛入门【码蹄集进阶塔335题】(MT2301-2305)
  • 原文地址:https://blog.csdn.net/qq137464739/article/details/126241244