JNI基础

JNI JNI基础 前言 本文过一遍JNI基础。 1. CMakeList.txt gradle脚本如下: android{ defaultConfig { externalNativeBuild { cmake { cppFlags "-std=c++11" } } } externalNativeBuild { cmake { path file(' 阅读详情

JNI基础

  1. 将java中的字符串转换成C中字符串的工具方法

    char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr){
         char*   rtn   =   NULL;
         jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");
         jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312");
         jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
         jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
         jsize   alen   =   (*env)->GetArrayLength(env,barr);
         jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
         if(alen   >   0)
         {
          rtn   =   (char*)malloc(alen+1);         //"\0"
          memcpy(rtn,ba,alen);
          rtn[alen]=0;
         }
         (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
         return rtn;
    }
  2. 程序被运行要经历两个步骤(1.编译 2.链接)
    编译就是将源文件编译成二进制代码,而链接则是将二进制代码转换成可执行的文件如.exe等头文件.(函数的声明,函数的清单文件)作用: 给编译器看的.
    库函数: 头文件里面函数的实现.
    作用:给连接器看的.

  3. jni开发的常见错误:
    错误1: 忘记编写android.mk文件 unknown file: ./jni/Android.mk
    Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk
    /cygdrive/c/android-ndk-r7b/build/core/add-application.mk:133: Android NDK: Aborting… 。 停止。

    错误2: ndk-build 没有任何反应.
    忘记配置android.mk脚本

    错误3: $ ndk-build jni/Android.mk:4: 遗漏分隔符 。 停止。
    中文的回车或者换行

    错误4:java.lang.UnsatisfiedLinkError: hello
    忘记加载了c代码的.so库 或者 函数的签名不正确,没有找到与之对应的c代码

    错误5:07-30 java.lang.UnsatisfiedLinkError: Library Hel1o not found
    没有找到对应的c代码库

    错误6: * *
    07-30 11:53:17.898: INFO/DEBUG(31): Build fingerprint:
    ‘generic/sdk/generic/:2.2/FRF91/43546:eng/test-keys’
    c代码里面有严重的逻辑错误,产生内存的泄露.

    错误7:
    make: * [obj/local/armeabi/objs/Hello/Hello.o] Error 1
    编译的时候 程序出现了问题,c语言的语法有问题
    c语言代码编译错误的时候 先去解决第一个错误.

  4. Java调用JNI的前提
    开发所使用的电脑(windows系统, x86的CPU)
    目标代码: android手机上运行的.( linux系统, arm的CPU)
    所以我们要模拟手机的系统,手机的处理器,生成手机上可以运行的二进制代码这就要用到交叉编译;
    根据运行的设备的不同,可以将cpu分为:

    • arm结构 :主要在移动手持、嵌入式设备上。
    • x86结构 : 主要在台式机、笔记本上使用。如Intel和AMD的CPU 。
      交叉编译: 在一种操作系统平台或者cpu平台下 编译生成 另外一个平台(cpu)可以运行的二进制代码.(使用NDK中的ndk-build命令)

    • 工具一: 交叉编译的工具链: NDK
      NDK全称:Native Development Kit 。

    • NDK是一系列工具的集合,它有很多作用。
      • 首先,NDK可以帮助开发者快速开发C(或C++)的动态库。
      • 其次,NDK集成了交叉编译器。使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

    NDK工具是提供给Linux系统用的(随着版本的升级也可以直接在Windows下使用,但是现在仍不完善有bug),
    所以要在windows下使用ndk的工具,必须要提供一个工具(linux环境的模拟器)

    • 工具二: cygwin(windows下linux系统环境的模拟器, 主要是为了能够运行ndk的工具)
      安装 devel shell
      linux 特点:所有的设备 硬件 都是以文件的方式定义的.

    • 工具三: cdt(c/c++ develop tools) eclipse 的一个插件 用来让c\c++代码 语法高亮显示.
      adt(android develop tools)

    • 工具四:
      为了不用每次使用ndk-build命令都要进入到ndk的安装目录,这里要进行Path变量的配置。
      配置cygwin的环境变量: 在cygwin安装目录,etc目录,profile的文件 32行 添加ndk工具所在的目录.
      PATH="/usr/local/bin:/usr/bin:/cygdrive/d/android-ndk-r7b:${PATH}"在这个后面加上:ndk-build的路径(注意:在linux中路径的分隔符不是分号而是冒号),
      改成这样
      PATH="/usr/local/bin:/usr/bin:${PATH}:/cygdrive/d/android-ndk-r7b"//注意这里的路径是在linux系统下的ndk路径而不是windows下的路径

JNI开发步骤:

  1. 创建一个android工程
  2. JAVA代码中写声明native 方法 public native String helloFromJNI();
  3. 用javah工具生成头文件
  4. 创建jni目录,引入头文件,根据头文件实现c代码
  5. 编写Android.mk文件
  6. Ndk编译生成动态库
  7. Java代码load 动态库.调用native代码

JNI开发之Java中调用C代码步骤

  1. 在java中定义一个要调用的C的方法(本地方法)
    //1.定义一个native的方法
    public native String helloFromC();

  2. 在工程中新建一个jni文件夹(然后在这个文件夹中写c代码,在C中实现java里面定义的c方法默认的时候是自己手写c的方法名,
    但是很麻烦这里要参考七里面提供的方式,用javah编译后,然后拷贝h的头文件到jni文件夹中,在从h文件拷贝方法的名字,然后实现该方法).
    #include <stdio.h>
    #include <jni.h>
    //这个方法的名字的写法固定Java_表示这个方法由Java调用,cn_itcast_ndk表示java的包名DemoActivity表示
    //java中调用这个方法的类名helloFromC表示java中调用这个方法的方法名字

    jstring Java_cn_itcast_ndk_DemoActivity_helloFromC (JNIEnv* env , jobject obj){//这两个参数是固定必不可少的
           //return (*(*env)).NewStringUTF(env,"hello from c!");//调用NewStringUTF这个方法new出来一个java中的String类型的字符串
           return (*env)->NewStringUTF(env,"hello from c!" );//这个写法和上面这个注释掉的一样,只是更简洁一点
    }
  3. 在jni文件夹中编写android.mk文件,在这个文件夹中声明要编译的c文件名以后编译后生成的文件名

    LOCAL_PATH := $(call my-dir)  //将jni所在的目录返回去到LOCAL_PATH
    
    #clear_vars 一个函数 初始化编译工具链的所有的变量.
    
    
    #特点:清空所有的以LOCAL_开头的变量,但是不会清空LOCAL_PATH的变量
    
     include $(CLEAR_VARS)  
    
    #指定编译后的文件的名称 符合linux系统下makefile的语法. 
    
    LOCAL_MODULE    := Hello
    
    #指定编译的源文件的名称 ,编译器非常智能
    
    LOCAL_SRC_FILES := Hello.c
      #指定编译后的文件的类型. 默认编译成动态库 BUILD_SHARED_LIBRARY 扩展名.so .so代码体积很小  
    
    #                            静态库 BUILD_STATIC_LIBRARY 扩展名.a  .a代码体积很大
    
    include $(BUILD_SHARED_LIBRARY)
  4. cmd进入到当前的工程的文件夹中(也可以进入到当前工程的jni目录中),然后运行ndk-build工具就能将c文件编译成一个可执行的二进制文件. ->.so,
    注意用ndk-build编译之后一定要刷新,不然eclipse会缓存旧的不加载新的进来

  5. 刷新工程,就能看到多出了两个文件夹

  6. 在java中将要调用的c代码加载到java虚拟机中,通过静态代码块的方式

    public class DemoActivity extends Activity {
       //1.定义一个native的方法
       public native String helloFromC();
    
       static{
             //5.把要调用的c代码 给加载到java虚拟机里面
            System. loadLibrary("Hello");//注意写的是Hello不要加后缀
        }
    }
  7. 调用c代码

    public void click(View view){
      //调用c代码
      Toast.makeText(this, helloFromC(), 1).show();
    
    }
  8. 利用jdk的工具javah动态生成c方法名
    在上面的调用c中的方法的时候,在c中区实现这个方法的时候的方法名字写起来很复杂,而且容易出去,在java在jdk中提供了一个工具javah,
    我们只要在windows的dos窗口cmd到classes目录下去执行javah 包名.类名就能够由class文件动态的生成一个c的h文件,在这个h文件中有该class文件中的native方法的名字
    我们只要拷贝这个h文件到自己工程的jni目录中,然后在c文件中引入这个h文件,并拷贝这个h文件中的方法去实现就可以了

    
    #include <stdio.h>//这个<>是引入工具的h文件        
    
    
    #include "cn_itcast_ndk2_DemoActivity.h" //对于自己工程中的h文件用""来引入或者引入#include <jni.h>也可以      
    
    
    JNIEXPORT jstring JNICALL Java_cn_itcast_ndk2_DemoActivity_hello_1_1_1from_1_1_1c //拷贝h文件中生成的方法名
      (JNIEnv * env, jobject obj){ 
          return (*env)->NewStringUTF(env,"hello_from_c 2!" );
    
    }   

    然后就和上面的步骤一样了

    注意上面的这个javah的用法师在jdk1.6中用的,如果在jdk1.7中就不能这样用了
    对于jdk1.7在使用javah的工具的时候就不能够直接进入到classes目录下直接运行命令了,
    而是要将sdk中的platforms下的android版本中的android.jar这个路径加载到classPath的环境变量中(麻烦),或者是直接进入到src目录下用javah包名.类名(简单常用)

  9. 如何在c中向logcat中打印日志
    如果想像logcat打印日志就要用到谷歌在ndk中提供的一个工具log.h的头文件
    步骤:

    1. 在c文件的头上面导入文件,加入下面的这四行代码
      c
      #include <android/log.h> //导入log.h
      #define LOG_TAG "clog" //指定打印到logcat的Tag
      #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) //对后面的这个打印日志的方法起一个别名是LOGD
      #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
    2. 在android.mk中加载文件

      LOCAL_PATH := $(call my-dir)
      include $(CLEAR_VARS)
      
      LOCAL_MODULE    := Hello
      LOCAL_SRC_FILES := Hello.c
      LOCAL_LDLIBS += -llog   //新增加这一句,作用是 #把c语言调用的log函数对应的函数库加入到编译的运行时里面 #liblog.so,如果还要加载其他的就在后面继续 -lXXX
      include $(BUILD_SHARED_LIBRARY)
    3. 在c的代码中直接使用LOGD或者LOGI就能向logcat中输入打印信息

      JNIEXPORT jint JNICALL Java_cn_itcast_ndk3_DataProvider_add
      (JNIEnv * env, jobject obj, jint x, jint y){
          LOGI( "x=%d",x);
          LOGD( "y=%d",y);
          int result = x+y;
          LOGD( "result=%d",result);
          return result;
      }
  10. 如何将java的数据传递给c语言
    就是java在方法中传值,然后c通过参数得到数据处理后返回和上面的一样

  11. 将c中的字符串数组转成java中的string用到jni.h中的一个方法
    jstring (*NewStringUTF)(JNIEnv*, const char*);

  12. C中调用java
    c语言回调java的场景.

    1. 如果有一个操作已经有方便的java实现,才用c调用java可以避免重复发明一个轮子.
    2. 想在c代码里面通知界面更新ui.

    C调用java的 思想类似于java中的反射,我们在c中就是通过反射的c实现来找到java中的这个方法,
    在getMethodID的第二个参数是一个方法的签名,这里我们可以通过jdk提供的一个工具javap,来到classes目录下,
    然后用 javap -s 类名.方法名 来得到一个方法的签名,这样就能列出来所有方法的签名

    /**
     * env JNIEnv* java虚拟机环境的指针.
     *
     *jobject obj ,哪个对象调用的这个native的方法 , obj就代表的是哪个对象
     */
    JNIEXPORT void JNICALL Java_cn_itcast_ndk4_DataProvider_callmethod1
      (JNIEnv * env, jobject obj){
           //思考 java中的反射
           //1.找到某一个类的字节码
           //   jclass      (*FindClass)(JNIEnv*, const char*);
          jclass jclazz = (*env)->FindClass(env,"cn/itcast/ndk4/DataProvider" );
           if(jclazz==0){
                LOGI( "LOAD CLAZZ ERROR");
          } else{
                LOGI( "LOAD CLAZZ success" );
          }
           //2.找到类的字节码里面的方法.
           // jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    
          jmethodID  methodid = (*env)->GetMethodID(env,jclazz,"helloFromJava", "()V"); //最后一个参数是方法的签名
           if(methodid==0){
                LOGI( "LOAD methodid ERROR" );
          } else{
                LOGI( "LOAD methodid success" );
          }
    
           //3.调用方法
           //void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
          (*env)->CallVoidMethod(env,obj,methodid);
    }
  13. 小知识

    1. Android的API提供了SystemClock类,这个类中有一个方法
      public static void sleep(long ms),这个方法内部对Thread.sleep进行了封装对异常进行了try catch,平时用Thread.sleep还要自己进行捕捉,
      所以可以使用SystemColock.sleep()还简单

    2. Java中通过java虚拟机来调用c的代码,首先将c的库加载到虚拟机中,但是其实这个c代码并不是运行在java虚拟机中的,而是运行在虚拟机之外的一个单独的进程中

  14. 自定义一个View控件(用于表示锅炉的压力大小)

    1. 写一个类继承View(View是Android中所有能显示到界面上的东西全的父类)
    2. 重写onDraw()方法,这个方法是该控件被画到桌面上的时候调用的方法。
  15. C++与C代码的不同
    C++文件的后缀是cpp
    C++与C的不同就是C++提供了模板、继承、抽象等

    //将java字符串转成C++字符串的工具方法
    char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
    {
         char*   rtn   =   NULL;
         jclass   clsstring   =   (env)->FindClass("java/lang/String");
         jstring   strencode   =   (env)->NewStringUTF("GB2312");
         jmethodID   mid   =   (env)->GetMethodID(clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
         jbyteArray   barr=   (jbyteArray)(env)->CallObjectMethod(jstr,mid,strencode); // String .getByte("GB2312");
         jsize   alen   =   (env)->GetArrayLength(barr);
         jbyte*   ba   =   (env)->GetByteArrayElements(barr,JNI_FALSE);
         if(alen   >   0)
         {
          rtn   =   (char*)malloc(alen+1);         //"\0"
          memcpy(rtn,ba,alen);
          rtn[alen]=0;
         }
         (env)->ReleaseByteArrayElements(barr,ba,0);  //
         return rtn;
    }
    JNIEXPORT jstring JNICALL Java_cn_itcast_cpp_DemoActivity_HelloFromC
      (JNIEnv * env, jobject obj){
        //C代码
        //return (*env)->NewStringUTF(env,"haha from c"); 在C中env代表的是C中结构体的指针的指针
        //c++代码
        return env->NewStringUTF("haha from cpp");//在C++中env代表的是C++中结构体的指针
    }
  16. 对于JNI中的中文乱码问题
    老版本的ndk r7之前 r6 r5 r5 crystal r4(编译的时候 语言集 是iso-8859-1)
    在使用老版本ndk 编译出来的so文件的时候 要手动的进行转码.先用iso8859-1解码,再用utf-8编码,在r7(包括)之后的我们只要将C文件的格式改为UTF-8就可以了

  17. 文件的格式及格式转换
    格式转换的原理:

    1. 读取一段数据到内存
    2. 分析这一段数据
    3. 修改里面的内容
    4. 写到文件里面

    文件的格式:
    文件的存储方式是二进制0101这样
    那么怎么设别文件的类型呢?

    1. 根据扩展名
    2. 根据文件的头信息(头信息才是一个文件的真正的格式),有些文件我们修改了扩展名也可以打开,
      这是因为打开文件的程序区扫描了文件的头信息,并用头信息中的类型来打开了这个文件
  18. C中读取数据

    
    #include<stdio.h>
    
    main(){
    //用  法: FILE *fopen(char *filename, char *type); //第二个参数是打开的方式 rt就是读文件, rb就是读二进制
       FILE*    fp = fopen("1.txt","rt");
    //用  法: int fread (void *ptr, int size, int nitems, FILE *stream); 
                            //ptr要读的数据 放在哪一块内存空间里面.
                            //size 一次读的数据的长度.
                            //nitems 读多少次
                            //stream 从哪个文件里面 读
    
      char* buffer = malloc(sizeof(char)*12);
     int len=   fread(buffer,sizeof(char),12,fp);
    printf("读了%d个char\n",len);
       printf("str=%s\n",buffer);
       fclose(fp);  //关闭掉流
    
      system("pause");     
    }
  19. C中写文件

    
    #include<stdio.h>
    
    main(){
    //用  法: FILE *fopen(char *filename, char *type);
       FILE*    fp = fopen("1.txt","wt");
    //用  法: int fwrite(void *ptr, int size, int nitems, FILE *stream); 
                            //ptr要向文件写的是哪一块内存里面的数据
                            //size 一次写的数据的长度.
                            //nitems 写多少次
                            //stream 写到哪个文件里面
       char* str="hello from c";
       int len = fwrite(str,sizeof(char),12,fp);
       printf("写了%d个char\n",len);
       fclose(fp);  //关闭掉流
    
       system("pause");     
    }
  20. C语言文件操作模式
    “rt” 只读打开一个文本文件,只允许读数据
    “wt” 只写打开或建立一个文本文件,只允许写数据
    “at” 追加打开一个文本文件,并在文件末尾写数据
    “rb” 只读打开一个二进制文件,只允许读数据
    “wb” 只写打开或建立一个二进制文件,只允许写数据
    “ab” 追加打开一个二进制文件,并在文件末尾写数据
    “rt+” 读写打开一个文本文件,允许读和写
    “wt+” 读写打开或建立一个文本文件,允许读写
    “at+” 读写打开一个文本文件,允许读,或在文件末追加数据
    “rb+” 读写打开一个二进制文件,允许读和写
    “wb+” 读写打开或建立一个二进制文件,允许读和写
    “ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据

    对于文件使用方式有以下几点说明:
    文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:

    r(read): 读
    w(write): 写
    a(append): 追加
    t(text): 文本文件,可省略不写
    b(banary): 二进制文件


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
Android JNI(一) —— NDK与JNI基础 Android jni也是开发中的一个重要环节,也是实现java与C交互的平台,接下来就来学习JNI. 本篇文章大纲如下: 1、导读 2、什么是NDK 3、为什么使用NDK 4、NDK到SO 5、JNI 一、导读 在Android OS上开发应用程序,Google提供了两种开发包:SDK和NDK。你可以从Google官方查阅到有许多关于SDK的优秀书籍、文章作为参考,但是Google提供的NDK... 阅读详情

相关推荐

基于溶解气体分析(DGA)的变压器DGA数据故障诊断含代码含数据

在拥有可靠的DGA数据的前提下,结合机器学习分类算法,可以实现变压器的故障诊断。在此数据集的基础上,用随机森林跑出的结果如图。

Jason_Orton的博客 2706

JNI 笔记 (总结一些基础的,常用的)

看了一些博客的内容,总结

zhangbh的专栏 1832

为Codex添加任务完成提示音:提升开发效率的实用技巧

在自动化脚本开发和模型训练过程中,实时获取任务状态反馈是提升工作效率的关键。通过Hook机制,开发者可以在代码执行的关键节点注入自定义逻辑,实现各种自动化操作。Codex的Hook系统特别适合用于任务完成提醒,其post_execution节点能准确捕获执行结束事件。技术实现上,只需简单配置TOML文件并编写音频播放脚本,就能让系统在任务完成时自动播放提示音。这种声音反馈机制尤其适用于长时间运行的批量任务和模型训练场景,实测可提升30%以上的工作效率。结合动态音效选择和跨平台兼容方案,该技巧还能扩展为桌面通

weixin_26767391的博客 549

关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

转载:https://www.cnblogs.com/haimishasha/p/6117968.html 目录 1.1. ISO-8859-1 通常叫做Latin-11.2. GB2312/GBK 1.3 unicode 1.4 UTF 2.1 Unicode与各编码之间的直接转换2.2 Unicode与各编码之间的交叉转换2.3 编码过程中错误诊断参考3.1 getBytes(charse...

hupengfei_shenyang的博客 5万+

S32的进阶之路->3,S32DS新建/删除/导入工程

右击工程名,点击Delect进行工程删除。选中Delect project contents on disk则会彻底删除工程,不选中Delect project contents on disk工程文件会保存在工作空间中。在Improt Projects中选择工程所在文件夹,选中所需要导入的工程,勾选Copy projects into workspace。选中目标示例工程,点击Finish,完成创建工程。导入已有工程,右击右击Project Explorer空白处,选择Import。

LC_8575的博客 2227

【深度学习】基于BERT模型的情感分析(附实战完整代码+数据集)

情感分类是一个快速发展的研究领域,尽管众多模型和数据集在二分类任务中显示出很高的准确性,但细粒度的情感分类任务仍然是一个很大改进空间的领域。分析SST-5数据集,Munikar等人的先前工作表明,嵌入工具BERT允许使用简单的模型来实现最新的准确性。

aaaa_hsjsueu的博客 2万+

JNI各类型参数互相调用

1、java 传入的String  在 C 中转化为 char*打印出来 jstring obj; const char* string = (char*)(*env)->GetStringUTFChars(env,obj,NULL); __android_log_print(ANDROID_LOG_INFO, "JNIMsg",string); 2、'for' loop initial

明风的博客 2213

python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法

出现该Bug的原因主要是 账号密码无法登录,但原先使用该代码测试qq或者163的时候是可以通过的!问题在于各个公司邮件所处理的代码方式不一样

码农研究僧的博客 3503

JAVA 编码中文问题系统透彻讲解 UNICODE GBK UTF-8 ISO-8859-1 之间的区别

编码概念 计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字。 就像一个棋盘一样,不同的字,处于不同的位置,而不同的位置,有不同的数字编号。 有的棋盘很小,只能放数字和英文 有的大一点,还能放中文 有的“足够”大,能够放下世界人民所使用的所有文字和符号 如图所示,英文字符 A 能够放在所有的棋盘里,而且位置都差不多 中文字符, 中文字符 中 能够放在后两种棋盘里,并且位

litengbin的博客 1032

【离线OCR】微信离线实现图片OCR文本和表格识别

基于微信本地OCR引擎(由最新版微信自动安装)。通过Python对其官方调用逻辑进行完整翻译和封装,使开发者可以用简单的API调用其强大的OCR功能。

专注于医院数据分析技术与系统开发的创作与分享。 2625

微信小程序 “net::ERR_CONNECTION_REFUSED” 报错大揭秘与破解之道

在微信小程序开发与运行过程中,“net::ERR_CONNECTION_REFUSED” 报错是开发者常遇难题。该错误意味着小程序与服务器连接建立失败,会导致功能无法使用、数据加载异常等问题,严重影响用户体验和业务运转。本文系统剖析此错误,从网络环境不佳、服务器异常、小程序配置有误等常见触发场景入手,提供网络、服务器、配置、代码等多维度排查步骤,给出针对性解决策略,如修复网络、处理服务器故障、修正配置与代码错误,还提出开发与运维阶段的预防措施,助力开发者高效解决该报错问题。

邓邓子的博客 6146

JNI使用总结

相关概念 什么是jni 关于nkd 什么是交叉编译 C/C++语言常见术语 库函数 头文件 函数库 HelloWorld Java调用CC方法 CC方法调用Java方法 相关api 示例 数据类型的对应 jstring转换char char转换jstring C与C++中JNI实现的区别 JNIEnv 方法调用的区别 Androidmk说明 绕过JNI直接调用C函数 中文乱码问题 解决方法名冲突 注册JNI函数 静态注册 动态注册

3246

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

AI人人懂 244

【JNI】JNI基础语法

本文详细介绍了JNI(Java Native Interface)的核心语法与Java交互方法。首先对比了C和C++在JNI中的差异:C++需用extern "C"避免名称修饰,且JNIEnv的调用方式不同(C用(*env)->,C++用env->)。其次,讲解了JNI数据类型,包括基本类型(如jint、jboolean)和引用类型(如jobject、jstring),并区分了局部引用、全局引用和弱全局引用的使用场景。此外,文章详细说明了字符串和数组的操作方法,如NewStringUTF创建字符串、Ge

little_fat_sheep 1187

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android JNI基础篇(一)

JNI学习其实并不难,在这里,我将引导大家学习JNI的基础知识,认真学完本教程,你将更加坚信我说的话。来吧,我们一起学习!

kgdwbb的专栏 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android JNI学习(一)——NDK与JNI基础

JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互

Jason_Lee155的博客 1213

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

JNI编程—JNI基础

什么是JNI,怎么使用 JNI——Java Native Interface,它是Java平台的一个特性(并不是Android系统特有的)。其实主要是定义了一些JNI函数,让开发者可以通过调用这些函数实现Java代码调用C/C++的代码,C/C++的代码也可以调用Java的代码,这样就可以发挥各个语言的特点了。那么怎么使用JNI呢,一般情况下我们首先是将写好的C/C++代码编译成对应平台的动态库(windows一般是dll文件,linux一般是so文件等),这里我们是针对Android平台,所以只讨论so

G的博客 1853

JNI基础语法

我们知道Java代码的内存是由垃圾回收器来管理,而JNI代码则不受Java的垃圾回收器来管理,所以JNI代码提供了一组函数,来管理通过JNI代码生成的JNI对象,比如jobject,jclass,jstring,jarray等,对于这些对象,绝对不能简单的声明一个全局变量,在JNI接口函数里面给这个全局变量赋值这么简单,一定要使用JNI代码提供的管理JNI对象的函数,否则代码可能会出现预想不到的问题。我们推荐的方法是,当JNI函数调用的Java方法出现异常的时候,JNI函数应该合理的停止执行代码。

weixin_42046829的博客 3430

JNI基础简介

导读 在前面的几篇文章中,笔者介绍了C++中的指针、引用、智能指针、多线程、类型转换、异常处理等相关知识点,如果想要熟练掌握,并能在实际项目中运用,光是看肯定是毫无用处,纸上谈兵永远比不上脚踏实地的实在。。。 以下是前几篇文章的回顾: C++之RVO返回值优化 C++之const关键字 C++之指针扫盲 C++之智能指针 C++之指针与引用 C++之右值引用 C++之类型转换 C++之多线程一 C++之多线程二 C++之异常处理 从今天开始文章的内容将是一系列JNI入门的相关文章。 JNI JNI是Java

u012944685的专栏 3249

Android NDK—JNI基础

JNI技术简介与应用 JNI(Java Native Interface)是Java与C/C++之间的通信接口,允许Java程序调用本地代码。其主要优势体现在跨平台性、执行效率和安全加固三方面。使用流程包括:通过javac/javah生成头文件,创建C++库项目实现接口,编译生成动态库并集成到Java项目中。JNI定义了完整的数据类型映射体系,提供访问Java类成员、变量和方法的API,实现双向交互。该技术属于Java标准,广泛应用于需要高性能、硬件操作或代码保护的场景。

学习,思考,输出 846

[NDK/JNI系列04] JNI接口方法表、基础API与异常API

学习了如何在C++中调用Java的一些类和方法,例如System.currentTimeMillis(), Integer.parseInt(), String.substring()和ArrayList。 学习了如何使用JNI函数来查找类、获取方法ID、调用方法、创建对象、传递参数和返回值。 学习了如何使用JNI函数来检查、清除、打印和抛出Java异常。 学习了如何使用命名空间、常量和辅助函数来组织和简化的C++代码。 学习了如何在Kotlin中定义和调用原生方法,并使用System.loadLibrar

我其实什么都不会 6325

[转载] Android JNI编程—JNI基础

博客出处: http://www.jianshu.com/p/aba734d5b5cd  最近看到了很多关于热补的开源项目——Depoxed(阿里)、AnFix(阿里)、DynamicAPK(携程)等,它们都用到了JNI编程,并且JNI编程也贯穿了Android系统,学会JNI编程对于我们学习研究Android源码、Android安全以及Android安全加固等都是有所帮助的。但是

BreakingPoint 310

android jni 结构体_Android JNI编程—JNI基础

最近看到了很多关于热补的开源项目——Depoxed(阿里)、AnFix(阿里)、DynamicAPK(携程)等,它们都用到了JNI编程,并且JNI编程也贯穿了Android系统,学会JNI编程对于我们学习研究Android源码、Android安全以及Android安全加固等都是有所帮助的。但是对于我们这些写Android应用的,大部分时间都是在使用Java编程,很少使用C/C++编程,对于JNI编...

weixin_39858275的博客 515

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法的中文API Android JNI学习(五)——Demo演示 本片文章大纲如下: 1、导读 2、什么是NDK ...

木叶风的博客 280

基础JNI语法和常见使用

基础JNI语法 基础类型 Java类型 native类型 描述 boolean jboolean unsigned 8 bits byte jbyte signed 8 bits char jchar unsigned 16 bits short jshort signed 16 bits int jint signed 32 bits long jlong s...

xuexiangjys的博客 2169

安卓JNI基础知识

JNI 是java原生接口(Java Native Interface),它定义了 Android 从受管理代码(使用 Java 或 Kotlin 编程语言编写)编译的字节码与原生代码(使用 C/C++ 编写)进行交互的方法,也就是安卓通过JNI技术提供Java调用C/C++或者C/C++调用Java的能力。JNI 不依赖于供应商,支持从动态共享库加载代码,虽然有时较为繁琐,但效率较高。

Watom_663的博客 1260
上一篇: PopupWindow细节
下一篇: ListView专题
CharonChui
博客等级 码龄12年 66粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值