1 准备工作
先下相关的插件,进入setting,勾选这LLDB、NDK、CMake三个,点击OK后即可下载
![[image:1FF9CCB4-704A-4FEE-B79C-947D678168B5-38535-000200F9E7FB3A7F/3C179A1F-3DBD-4FE1-88B6-758EA442F287.png]](https://img-blog.csdnimg.cn/20190719154132131.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
2 Native C++工程
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019071915414975.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
简单总结一下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++字样
文件夹中多了这么几个内容
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190719154340227.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
最需要关心的就是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,随便起个名
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190719154351462.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
由于之前已经起了一个test.cpp测试通过了,所以这次我想试试c,所以新建了一个cxk.c
![[image:9420624E-BE36-427F-B55E-175455891083-38535-0001FF629251F3DA/Pasted Graphic 9.jpg]](https://img-blog.csdnimg.cn/20190719154408696.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
2、然后输入如下内容,注意红框的地方要改成你自己的包名和文件名,
![[image:B06FB579-4273-4BB4-9DC5-F6F22D79A7A4-38535-000207F280AC9E98/5E80CD1C-ACD6-42AC-8C0D-D2F39FA05506.png]](https://img-blog.csdnimg.cn/20190719154430241.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
#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.csdn.net/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]](https://img-blog.csdnimg.cn/20190719154506344.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
4、然后到MainActivity.java中加入如下三行代码
![[image:C41DC353-2986-4A17-9FC1-9516041C4686-38535-0001FF629280750A/Pasted Graphic 14.jpg]](https://img-blog.csdnimg.cn/20190719154531938.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
完整代码如下:
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 {
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);
TextView tv = findViewById(R.id.sample_text);
tv.setText(get2());
}
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]](https://img-blog.csdnimg.cn/20190719154547674.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
/app/build/intermediates/cmake/debug/obj/armeabi-v7a/目录下有我们在txt文件中指定的so文件名称,如下:
![[image:EA722236-07A0-4FD6-B70E-94F01FE23A75-38535-00020C34AF72B21F/F06500B5-C384-4F2E-96F0-87EB448A3DB2.png]](https://img-blog.csdnimg.cn/20190719154558395.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jmel81MA==,size_16,color_FFFFFF,t_70)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)