美文网首页android
Android使用cmake进行ndk开发

Android使用cmake进行ndk开发

作者: Daniel_adu | 来源:发表于2017-05-08 19:43 被阅读1022次

    1.首先得看懂cMake文件,即CMakeList.txt

    CMake:CMakeList.txt 文件说明
    cmake入门实战

    CMake里面有几个关键的知识点:

    1. add_library 就是你想要将这个c++程序变成什么名字的库,以及这些c++程序在哪里
    2. cmake_minimum_required,最低支持的cmake版本,例如: cmake_minimum_required(VERSION 3.4.1)
    3. target_link_libraries:有两个参数,第一个参数表明库的目标,即第一步生成的库的名字,第二个参数是要在项目中使用的库,这个库已经存在了。
    4. find_library:这个方法有两个参数,第一个参数是想引入的库的名字,第二个是想把这个库放在这个项目的什么地方

    2.简单的C++开发步骤:

    (1)编写cmake文档
    (2)自己写一个专门针对这个C++文件的java文件,比如MyCFunction类
    (3)在cpp文件夹下写C++代码,注意C++的函数的名字是MyCFunction类的绝对位置+函数名,中间使用_隔开。可以使用.h文件来控制代码。
    (4)然后再在MyCFunction类中添加方法名,前面加上native
    (5)使用之前一定要加上LoadLibrary(),名字就是在cmake中add_library的名字。
    (6)最后就能够在其他java代码中使用MyCFunction进行方法调用了。

    注意的几点:

    (1)jni为java代码提供了输入,然后再在c++代码中提取出来,输入的参数直接写在入参的后面(本身就有两个入参,只需要加在后面就行)
    (2)可以将System.loadLibrary放在Application开始的地方,这样app开始就会加载这个so文件

    简单C++开发的对应代码

    (1)C++文档

    Java_com_microsoft_hond_jnitest_MyCFunction.h(我的java对应的类就是MyCFunction.java)

    #include <jni.h>
    
    #ifndef Java_com_microsoft_hond_jnitest_MyCFunction
    #define Java_com_microsoft_hond_jnitest_MyCFunction
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    JNIEXPORT jstring JNICALL Java_com_microsoft_hond_jnitest_MyCFunction_stringFromJNI
            (JNIEnv *, jobject,jstring s);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    

    native-lib.cpp

    #include "Java_com_microsoft_hond_jnitest_MyCFunction.h"
    
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_microsoft_hond_jnitest_MyCFunction_stringFromJNI(JNIEnv* env, jobject,jstring s) {
        const char *str = env->GetStringUTFChars(s,0);
        return env->NewStringUTF(str);
    }
    
    

    这里有一个输入:jstring s

    (2)MyAssplcation类,继承了Application

    public class MyApplication extends Application{
    
        @Override
        public void onCreate() {
            super.onCreate();
            System.loadLibrary("native-lib");
    
        }
    }
    
    

    (3)MyCFunction.java 用来连接java和C之间的桥梁

    public class MyCFunction {
        public native String stringFromJNI(String s);
    }
    
    

    (4)使用的类,这里是一个Activity

    MyCFunction m = new MyCFunction();
        tv.setText(m.stringFromJNI("my word"));
    
    

    附上Java和本地中间类型的对比:

    image.png

    而怎么在C/C++里面调用Java程序呢?个人不建议,个人觉得只有在java的功能和性能上有需求时再使用C/C++代替,而不需要反过来使用C/C++调用java的部分。一般是java将入参输入进去,然后C/C++产生一个输出给java。但是既然要做,也是可以的

    jclass jclazz = env->findClass(env,"类的绝对路径,中间使用/分开");
    jmethodID jmethodIDs = env->GetMrthodID(env,jclazz,"方法名","(Ljava.String返回类型)V");
    env->CallVoidMtthod(env,jobj(入参),jMethodId);//这里面有好几个方法,CallVoidMethod,CallStaticVoidMethod等等
    //结束后可以删除引用 
    env.DeleteLocalRef(jclazz);
    

    相关文章

      网友评论

        本文标题:Android使用cmake进行ndk开发

        本文链接:https://www.haomeiwen.com/subject/vkdvtxtx.html