Android Cmake 编译c,c++源文件,实现JNI调用
2017-07-14 17:39
645 查看
这几天研究了一下安卓涉及到JNI相关的知识点,本以为很简单的东西,结果实现起来各种错误,现在总结一下贴出来
希望有帮助
这篇文章,只介绍使用Cmake去编译so文件,NDK的先不讨论,个人觉得ndk比较麻烦
1、首先需要下载Cmake,这个AS都自带了功能,见下图
Cmake是一个编译工具,LLDB应该是一个NDK下的调试工具,NDK不必说了,三个都更新一下
如果使用NDK的话,需要配置NDK的环境变量
2、新建一个项目,注意哦,不要勾选Include C++ Support
最好不要勾选,我们需要一步一步来
3、在项目的main目录下新建cpp文件夹,并且建立你需要的.cpp .h文件
JniTest.h JniTest.cpp native-lib.cpp(CmakeLists.txt稍后再讲)
这里简单贴一下三个文件的源码,就是求(a+10)的值,native-lib.cpp是开放给java层调用的,再里面负责调用JniTest里面的内容
JniTest.h:
JniTest.cpp:
native-lib.cpp:
(JNIEnv* env,jobject object)这两个是必须要的,后面的jint a 是接受java层的参数
下面看CmakeList.txt
照着这个写就好了
4、最后配置一下 app gradle
5、现在在java层调用就好啦
希望有帮助
这篇文章,只介绍使用Cmake去编译so文件,NDK的先不讨论,个人觉得ndk比较麻烦
1、首先需要下载Cmake,这个AS都自带了功能,见下图
Cmake是一个编译工具,LLDB应该是一个NDK下的调试工具,NDK不必说了,三个都更新一下
如果使用NDK的话,需要配置NDK的环境变量
2、新建一个项目,注意哦,不要勾选Include C++ Support
最好不要勾选,我们需要一步一步来
3、在项目的main目录下新建cpp文件夹,并且建立你需要的.cpp .h文件
JniTest.h JniTest.cpp native-lib.cpp(CmakeLists.txt稍后再讲)
这里简单贴一下三个文件的源码,就是求(a+10)的值,native-lib.cpp是开放给java层调用的,再里面负责调用JniTest里面的内容
JniTest.h:
#ifndef JNITEST_CMAKE_MAX_H #define JNITEST_CMAKE_MAX_H int test(int a); #endif //JNITEST_CMAKE_MAX_H
JniTest.cpp:
int test(int a) { return 10 + a; }
native-lib.cpp:
#include <jni.h> #include "JniTest.h" extern "C" { jint Java_com_test_MainActivity_maxFromJNI( JNIEnv* env, jobject object, jint a) { return test(a); } }
(JNIEnv* env,jobject object)这两个是必须要的,后面的jint a 是接受java层的参数
下面看CmakeList.txt
# 指定cmake最低版本,如果不知道就复制吧 cmake_minimum_required(VERSION 3.4.1) # 第一个native-lib是供java调用的文件, SHARED是啥没看明白但是要写上 # 最后俩是所有cpp的名字和相对本文件的位置,这里在一个文件夹中就直接写名字了,文件有多少写多少 add_library(native-lib SHARED native-lib.cpp JniTest.cpp) # 我的理解是java要连接到native-lib,和一些其它的东西,不懂 target_link_libraries(native-lib)
照着这个写就好了
4、最后配置一下 app gradle
5、现在在java层调用就好啦
public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.text); textView.setText(maxFromJNI(14) + ""); } public native int maxFromJNI(int a); }
相关文章推荐
- Android NDK编译c,c++源文件,实现JNI调用
- JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程
- JNI NDK (AndroidStudio+CMake )实现Java调用C C++代码流程
- cocosdx交叉编译到android使用jni实现java端调用C++方法
- Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调
- 在Android中,通过JNI实现C++与Java相互调用
- Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- (跨平台)cocos2d-x C++ or Object-C(前端)调用C# webservices(后台),实现交叉编译到Android/IOS/WinPhone等移动终端设备
- android studio的cmake中调用opengles库,实现c++编译opengles
- android实现app通过jni调用C/C++方法
- Android利用JNI实现java调用C或C++
- android调用本地C/C++代码,jni的实现
- AndroidStudio使用CMake编译jni的C/C++文件
- Android Studio cmake编译FFmpeg以及Jni调用
- Android SurfaceFligner Vsync信号 Jni/C++调用实现
- android实现app通过jni调用C/C++方法
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)