JNI——Java与C/C++的交互

JNI实现Java与C/C++交互的核心:native

1、在Java类中声明好双方交互的接口,用native修饰;

2、通过javac Xxx.java生成 Xxx.class文件;

3、通过javah Xxx生成Xxx.h文件;

4、在.cpp中实现native方法(可以调用本地其它C/C++方法);

5、编译生成lib库,Mac终端命令:g++ -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home/include xxxxxx.cpp -o libhi.jnilib;(libhi--hi为库名)

6、运行java Xxx。

-------》〉》〉在C/C++中调用Java时,应先将JVM注册到当前线程,代码如下:

声明全局变量:   

  • JavaVM* g_jvm = NULL;
  • jobject jni_obj;

初始化:

  • env->GetJavaVM(&g_jvm);
  • jni_obj = env->NewGlobalRef(obj);

在当前C/C++方法中注册JVM:

  • JNIEnv* jni_env;
  •  g_jvm->AttachCurrentThread(&jni_env, NULL);

下面资源先标记下,以后有时间再细写。

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

Mark:

一、jni.h头文件资源:

https://github.com/mapbox/jni.hpp/blob/master/test/openjdk/jni.h

——————————————————————————————————————————————

二、非常好的博客,讲解很详细,文末附有官方文档链接

http://www.cnblogs.com/likwo/archive/2012/05/21/2512400.html

——————————————————————————————————————————————

三、文末有IBM的技术原文链接(规范使用JNI)https://blog.csdn.net/ostrichmyself/article/details/4557851

——————————————————————————————————————————————

四、源自:https://blog.csdn.net/zddblog/article/details/8661095

jclass list_cls = env->FindClass("Ljava/util/ArrayList;");

jmethodID list_costruct = env->GetMethodID(list_cls , "<init>","()V");

jobject list_obj = env->NewObject(list_cls , list_costruct);

//获得该类型的构造函数  函数名为 <init> 返回类型必须为 void 即 V  
    //第三个参数根据构造函数的类型设定
    //例如:"(Ljava/lang/String;F)V"表示Java中方法为void xxx(String, float)其中,xxx表示函数名
    //-------------------------------------------------
    //基本JNI域描述符
    //    Z    --    boolean
    //    B    --    byte
    //    C    --    char
    //    S    --    short
    //    I    --    int
    //    J    --    long
    //    F    --    Float
    //    D    --    double
    //引用类型的描述符
    //    Object    --    Ljava/lang/Object;   //注意此处的分号(;)是JNI的一部分,不能省。
    //    String    --    Ljava/lang/String;
    //    int[]    --    [I
    //    float[]    --    [F
    //    String[] -- [Ljava/lang/String;
    //方法表示示例
    // int f (int i, Object object) -- (ILjava/lang/Object;)I
    //void set (byte[ ] bytes) --  ([B)V

 

  1. //jstring to char*
  2. char* jstringTostring(JNIEnv* env, jstring jstr)
  3. {
  4.     char* rtn = NULL;
  5.     jclass clsstring = env->FindClass("java/lang/String");
  6.     jstring strencode = env->NewStringUTF("utf-8");
  7.     jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
  8.     jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
  9.     jsize alen = env->GetArrayLength(barr);
  10.     jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
  11.     if (alen > 0)
  12.     {
  13.         rtn = (char*)malloc(alen + 1);
  14.         memcpy(rtn, ba, alen);
  15.         rtn[alen] = 0;
  16.     }
  17.     env->ReleaseByteArrayElements(barr, ba, 0);
  18.     return rtn;
  19. }
  20.  
  21. //char* to jstring
  22. jstring stringToJstring(JNIEnv* env, const char* pat)
  23. {
  24.        jclass strClass = env->FindClass("Ljava/lang/String;");
  25.        jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
  26.        jbyteArray bytes = env->NewByteArray(strlen(pat));
  27.        env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
  28.        jstring encoding = env->NewStringUTF("utf-8");
  29.        return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
  30. }

 

  1. char* bytesToChars(JNIEnv* env, jbyteArray byteArr) 
  2.     jbyte* bytes;
  3.     bytes = env->GetByteArrayElements(byteArr, 0);
  4.     int len = env->GetArrayLength(byteArr);
  5.     char* chars = new char[len+1];
  6.     memset(chars,0,len+1); 
  7.     memcpy(chars,bytes,len);
  8.     chars[len] = 0;
  9.     env->ReleaseByteArrayElements(byteArr, bytes, 0);
  10.     return chars; 
  11. }

———————————————————————————————————————————————————

五、JNI内存泄漏分析:https://blog.csdn.net/renxianzuo/article/details/6824716

————————————————————————————————————————————

六、该博文集合了很多JNI资料,很杂,Chapter6、7讲的不错,目前只看到Chapter7,前面可直接忽略 https://blog.csdn.net/taily_duan/article/details/52816504

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值