Android开发经验谈Android开发Android知识

Android NDK入门 —— CMake

2017-09-19  本文已影响117人  CrayfishXu

前言

我会在小专栏简书一起分享。
上篇说了入门一个NDK程序,大致讲解了如何简单的使用ndk-build。

正题

首先新建一个Android项目,记得勾选“Include C++ support”。
接着一直Next到Customize C++ Support页面,有两个勾选暂时用不到,先不勾选,这是定义模块依赖的C++功能,fexceptions和frtti。
最后点击finish就完成。
接着等待进去项目界面,我喜欢切换到Project模式看,跟普通项目多了cpp文件夹和CMakeLists.txt,.externalNativeBuild文件夹省略不看。
查看app下的build.gradle可以发现多了cmake标记,如果你前面勾选了,就会在cppFlags增加那两个C++功能模块。
然后我们来看代码MainActivity和native-lib.cpp,CMakeLists.txt
public class MainActivity extends AppCompatActivity {

    // 加载'native-lib' so文件
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());//使用native方法
    }

    /**
     * 一个native方法,会在 'native-lib'中实现
     */
    public native String stringFromJNI();
}
#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
//实现java中stringFromJNI方法
Java_com_crayfish_cmakehello_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
//最小cmake版本
cmake_minimum_required(VERSION 3.4.1)
add_library(native-lib SHARED
             src/main/cpp/native-lib.cpp )
find_library( log-lib log )
target_link_libraries(native-lib  ${log-lib} )

CMakeLists中add-library是加载本地库,find_library是加载NDK库,target_link_libraries是关联库。
native-lib是so文件的名字,src/main/cpp/native-lib.cpp是对应c++文件。
STATIC:静态库,是目标文件的归档文件,在链接其它目标的时候使用。
SHARED:动态库,会被动态链接,在运行时被加载。
MODULE:模块库,是不会被链接到其它目标中的插件,但是可能会在运行时使用。
接下来,我们新增一个native方法

public native int IntegerFromJNI(int x,int y);

我们来完善一下C++中方法,记得自己加上“extern "C"”,不然会报错的。

extern "C"
JNIEXPORT jint JNICALL
Java_com_crayfish_cmakehello_MainActivity_IntegerFromJNI(JNIEnv *env, jobject instance, jint x, jint y) {
    // TODO
    return x + y;
}

如果你是要新增一个C++文件的话那么就修改CMakeLists.txt

add_library(native-lib SHARED
             src/main/cpp/native-lib.cpp 
             src/main/cpp/hello-lib.cpp )

结尾

大致内容到这里,有不足之处望大家指出。这两篇大致都是讲解了简单的建立项目,后面我会写一篇编译多个so文件。

上一篇 下一篇

猜你喜欢

热点阅读