android ndk学习

Jni第一个案例

2021-10-17  本文已影响0人  大旺旺的弟弟小旺旺

显示一句话

#使用的版本
cmake_minimum_required(VERSION 3.10.2)
#项目名称
project("ndkdemo")
#编译出的so库的名称
set(libname javacallc)  #编译之后的名字  不一样要和文件名相同
#增加的头  也可以理解为找头文件的位置
add_library( # Sets the name of the library.
        javacallc
        SHARED
        utils/LogUtils.cpp
        utils/LogUtils.h
        handler/Handler01.cpp
        handler/Handler01.h
        Sample01/Sample01.cpp
        Sample01/Sample01.h 
        native.cpp)
find_library(
        log-lib
        log )
#编译那些东西
target_link_libraries( # Specifies the target library.
        javacallc
        ${log-lib} )
extern "C" jstring Java_com_kangwang_javacallc_Demo01_stringFromJNI(JNIEnv *env, jobject thiz) {
    // TODO: implement stringFromJNI()
    Sample01 *sample01 = new Sample01(env);
    return sample01->getInfo();
}
  static {
        System.loadLibrary("javacallc");
    }
    public void printMsg(){
        System.out.println(stringFromJNI());
    }

    public native String stringFromJNI();

分析

jni参数说明

class _jstring : public _jobject {};
typedef _jstring*       jstring;

可以看到jstring的父类是_jstring*,_string的类型是jobject;

常用类型操作

    std::string hello = "Hel";
    return env1->NewStringUTF(hello.c_str());
public native void arrTest(int arr[],String[] str);

jni代码

extern "C"
JNIEXPORT void JNICALL
Java_com_kangwang_javacallc_Demo01_arrTest(JNIEnv *env, jobject thiz, jintArray arr,
                                           jobjectArray str) {
    // TODO: implement arrTest()
}

实现

    // TODO: implement arrTest()
    //得到第一个数据的位置
    jint *intarr = env->GetIntArrayElements(arr, NULL);
    int arrlenght = env->GetArrayLength(arr);
    for (int i = 0;i<arrlenght ;i++){
        LOGI(*(intarr+i));
    }
    //第三个  model
//    0:刷新java数组  并释放c/c++
//    1:只刷新java数组
//    2:只是释放
    env->ReleaseIntArrayElements(arr,intarr,0);


//定义类型
    int strLength = env->GetArrayLength(str);
    for (int i = 0; i <strLength; ++i) {
        jstring ss = static_cast<jstring>(env->GetObjectArrayElement(str, 0));
        const char* chara = env->GetStringUTFChars(ss,0);
        env->ReleaseStringUTFChars(ss, chara);
    }

数据分为基本数据类型和定义数据类型

typedef _jobject*       jobject;
typedef _jclass*        jclass;
typedef _jstring*       jstring;
typedef _jarray*        jarray;
typedef _jobjectArray*  jobjectArray;
typedef _jbooleanArray* jbooleanArray;
typedef _jbyteArray*    jbyteArray;
typedef _jcharArray*    jcharArray;
typedef _jshortArray*   jshortArray;
typedef _jintArray*     jintArray;
typedef _jlongArray*    jlongArray;
typedef _jfloatArray*   jfloatArray;
typedef _jdoubleArray*  jdoubleArray;
typedef _jthrowable*    jthrowable;
typedef _jobject*       jweak;

基本数据类型加j,

上一篇下一篇

猜你喜欢

热点阅读