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 <jni.h>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;@Overrideprotected 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;@Overrideprotected 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个项目的完整代码地址:
GitHub - ZengHongHua/NativeDemo2: 编译demo
lib使用:
GitHub - ZengHongHua/TestLib: lib使用
Android编译C/C++代码,编译出的so文件给别的项目用,CMakeLists.txt编译,请放弃Android.mk!相关推荐
- android 多个c文件编译成一个so,AndroidStudio使用CMakeLists.txt编译多个so库
对于单个so库编译就不说了,AndroidStudio可以直接生成单个so库编译的模板 对于实际项目中,多用到的是好几个库,下面说一下编译多个so库的情况 TIM图片20180927155108.pn ...
- Cmake + CMakeLists.txt 编译SO库(JNI编译)
cmake android-ndk google demo- https://github.com/googlesamples/android-ndk 在Android Studio中使用C/C++库 ...
- Android中如何使用代码打开各种类型的文件
介绍 本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3.wav.ogg等).视频文件(3gp.mp4等).图片文件(jpg.png.gif等).安装包(apk).文档(txt. ...
- 手机如何打开c语言文件类型,Android中如何使用代码打开各种类型的文件
介绍 本篇用于介绍Android中如何打开各种类型的文件,如:音乐文件(mp3.wav.ogg等).视频文件(3gp.mp4等).图片文件(jpg.png.gif等).安装包(apk).文档(txt. ...
- CmakeLists.txt编译问题
在TX1上编译cpp文件,PCL安装位置在SSD上,cmake时出现错误: Could not find PCLConfig.cmake or pcl-config.cmake 解决办法: 在Cmak ...
- Android 反编译获取class代码
转载自: http://blog.csdn.NET/vipzjyno1/article/details/21039349/ 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开 ...
- notepad编译java_Notepad++直接编译运行java代码的具体步骤
最近不少朋友表示还不会Notepad++直接编译运行java代码的操作步骤,使用下面小编就带来了Notepad++直接编译运行java代码的操作方法哦,一起去看看吧. Notepad++直接编译运行j ...
- linux下c++编译(g++)、cmake配置完结、配置json文件并调试项目、进程管理
一.构建项目编译规则 1.系统配置: 系统要求:linux centos7 编译器:g++ 调试器:gdb 以及cmake IDE:vscode 可以通过命令去查看linux下是否安装:通过–vers ...
- cmake 编译文件 CMakeLists.txt 语法介绍与实例演练
一.Cmake 简介 cmake 是一个跨平台.开源的构建系统.它是一个集软件构建.测试.打包于一身的软件.它使用与平台和编译器独立的配置文件来对软件编译过程进行控制. 二.常用命令 1. 指定 cm ...
最新文章
- 类脑计算的一大突破 BrainScaleS-2
- 【经验】CentOS 5.2 下用Yum安装Apache+PHP+MySQL环境
- EntityFramework SaveChange()方法不能更新的问题
- WinForm 异步调用方法
- 集芯片的焊接技巧:从LQFP64说起
- 最新的Java SE平台和JDK版本发布计划
- Deepin 20.2.3系统标题栏及其按钮美化
- 0001-Two Sum(两数之和)
- 浅谈GSM/GPRS模块软硬件设计(基于有方M660+模块和单片机)
- 数据结构之图:加权有向图与dijkstra算法找到最短路径,Python——28
- MySQL安装成功后dos命令行设置密码
- 字符串p型编码(信息学奥赛一本通-T1145)
- 计算机编程的21条规律 -- 转
- .net 任务调度 mysql_C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件...
- java简单增删改查_JAVA JDBC 简单的增删改查
- STL - queue(队列)
- 问道手游服务器维护,问道手游2021年5月20日维护公告_问道手游2021年5月20日更新了什么_玩游戏网...
- 类型转换操作符(C++)
- 通讯录_你有多久没翻过通讯录了?
- 计算机技术中储存容量最大的单位,计算机中最大单位是什么