• Jni下NDK开发的bug问题汇总


              前段时间在做Android下jni的部分,遇到了一些bug和错误,找了好久,给整理了一下,留着以后查找方便

    1.c和c++的 mk文件不一样,记着要区分。

    网友给一个比较全的文件有:

    c++正确的mk文件:

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := TestSm3

    LS_CPP=$(subst $(1)/,,$(wildcard $(1)/*.cpp))

    LOCAL_SRC_FILES := $(call LS_CPP,$(LOCAL_PATH))

    include $(BUILD_SHARED_LIBRARY)

    2.就是类型转换的问题

    要把各种数据类型都转化好,这样传入的数据才可以。

    包括jstring 怎么转为char*之类的

    3.还有就是jni下面调用c++中的类还是不一样的。

    要这样来调用。

    image

    Jni中调用c++中的类要这样来调:

    /*

    * 测试SM3的口令算法

    */

    JNIEXPORT jint JNICALL Java_com_test_testndksm3_JniClient_generateOTPWithSM3

      (JNIEnv * env, jclass arg, jobject T0, jobject TC, jobject C, jstring Q, jbyteArray K, jint codeDigits)

      {

      //算法

        CSm3otp *Sm3otp=new CSm3otp;

    Sm3otp->hotpWithKey("E65C4257CB8D9C79747B8E21C82AEBEC","000000005034B136",8);

        return atoi(Sm3otp->computePassword());

      }

    4.这种错误为数据类型不匹配的错误

    JX3@9V6_I(O[UV6]MYQ2ZD5

    记着转换数据类型,包括jstring 和jbyte之间的转换

    clipboard

    --------------------------------------

    当时遇到的几个数据类型的转换,都是无误的,我把代码留下:

    /////////////////
    //jstring to char*
     char* jstringTostring(JNIEnv* env, jstring jstr)
     {        
     char* rtn = NULL;
     jclass clsstring = env->FindClass("java/lang/String");
     jstring strencode = env->NewStringUTF("utf-8");
     jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
     jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
     jsize alen = env->GetArrayLength(barr);
     jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
     if (alen > 0)
     {
     rtn = (char*)malloc(alen + 1);
     memcpy(rtn, ba, alen);
     rtn[alen] = 0;
     }
     env->ReleaseByteArrayElements(barr, ba, 0);
     return rtn;
     }
    ///////////////////////
    
    
    //char* to jstring
    jstring toJstring(JNIEnv* env, const char* pat) { 
      jclass strClass = env->FindClass("java/lang/String"); 
      jmethodID ctorID = 
        env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); 
      jbyteArray bytes = env->NewByteArray(strlen(pat)); 
      env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat); 
      jstring encoding = env->NewStringUTF("utf-8"); 
      return (jstring)env->NewObject(strClass, ctorID, bytes, encoding); 
    } 
    
    
    
     /////////////////////////////////////////
  • 相关阅读:
    android开发布局三(微信布局)
    Android开发adb,SQLite数据库运用
    直线电机磁负荷、电负荷
    MIT公开课(一):电场和偶极子
    哈工大电气工程系硕士研究生入学复试——自动控制原理1、2章
    直线电机与旋转电机的区别
    Math类介绍
    Scala编辑器和IntelliJ IDEA开发环境配置
    减少cpu的方法
    AS内存清理,建议以及查找内存泄露的方法
  • 原文地址:https://www.cnblogs.com/yejiurui/p/2989297.html
Copyright © 2020-2023  润新知