`

jni参数的转换(2)

 
阅读更多
1.传递字符串
到目前为止,我们还没有实现Java程序向C程序传递参数,或者C程序向Java程序传递参数。本例程将由Java程序向C程序传入一个字符串,C程序对该字符串转成大写形式后回传给Java程序。

Java源程序如下。

代码清单15-6 在Linux平台上调用C函数的例程——Sample1

      public class Sample1

      {

      public native String stringMethod(String text);

     public static void main(String[] args)

     {

         System.loadLibrary("Sample1");

          Sample1 sample = new Sample1();

          String text   = sample.stringMethod("Thinking In Java");

       System.out.println("stringMethod: " + text);

    }

}

Sample1.java以“Thinking In Java”为参数调用libSample1.so中的函数stringMethod(),在得到返回的字符串后打印输出。

Sample1.c的源程序如下。

代码清单15-7 在Linux平台上调用C函数的例程——Sample1.c

      #include <Sample1.h>

      #include <string.h>   

      JNIEXPORT jstring JNICALL Java_Sample1_stringMethod(JNIEnv *env, jobject obj, jstring string)

      {

          const char *str = (*env)->GetStringUTFChars(env, string, 0);

          char cap[128];

          strcpy(cap, str);

          (*env)->ReleaseStringUTFChars(env, string, str);

       int i=0;

       for(i=0;i<strlen(cap);i++)

         *(cap+i)=(char)toupper(*(cap+i));

       return (*env)->NewStringUTF(env, cap);

    }

首先请注意函数头部分,函数接收一个jstring类 型的输入参数,并输出一个jstring类型的参数。jstring是jni.h中定义的数据类型,是JNI框架内特有的字符串类型,因为jni.h在 Sample1.h中被引入,因此在Sample1.c中无须再次引入。

程序的第4行是从JNI调用上下文中获取UTF编码的输入字符,将其放在指针str所指向 的一段内存中。第9行是释放这段内存。第13行是将经过大写转换的字符串予以返回,这一句使用了NewStringUTF()函数,将C语言的字符串指针 转换为JNI的jstring类型。JNIEnv也是在jni.h中定义的,代表JNI调用的上下文,GetStringUTFChars()、 ReleaseStringUTFChars()和NewStringUTF()均是JNIEnv的函数。

2.递整型数组
本节例程将首次尝试在JNI框架内启用数组:C程序向Java程序返回一个定长的整型数组成的数组,Java程序将该数组打印输出。

Java程序的源代码如下。

代码清单15-8 在Linux平台上调用C函数的例程——Sample2

       public class Sample2

      {

     public native int[] intMethod();

      public static void main(String[] args)

      {

         System.loadLibrary("Sample2");

         Sample2 sample=new Sample2();

           int[] nums=sample.intMethod();

       for(int i=0;i<nums.length;i++)

      System.out.println(nums[i]);

   }

}

Sample2.java调用libSample2.so中的函数intMethod()。Sample2.c的源代码如下。

代码清单15-9 在Linux平台上调用C函数的例程——Sample2.c

      #include <Sample2.h>

     

      JNIEXPORT jintArray JNICALL Java_Sample2_intMethod(JNIEnv *env, jobject obj)

       {

      inti = 1;

       jintArray array;//定义数组对象

      array = (*env)-> NewIntArray(env, 10);

      for(; i<= 10; i++)

           (*env)->SetIntArrayRegion(env, array, i-1, 1, &i);

  

       /* 获取数组对象的元素个数 */

    int len = (*env)->GetArrayLength(env, array);

       /* 获取数组中的所有元素 */

    jint* elems = (*env)-> GetIntArrayElements(env, array, 0);

   for(i=0; i<len; i++)

       printf("ELEMENT %d IS %d\n", i, elems[i]);


   return array;

    }

Sample2.c涉及了两个jni.h定义的整型数 相关的数据类型:jint和jintArray,jint是在JNI框架内特有的整数类型。程序的第7行开辟出一个长度为10 的jint数组。然后依次向该数组中放入元素1-10。第11行至第16行不是程序的必须部分,纯粹是为了向读者们演示GetArrayLength() 和GetIntArrayElements()这两个函数的使用方法,前者是获取数组长度,后者则是获取数组的首地址以便于遍历数组。

3. 传递字符串数组
本节例程是对上节例程的进一步深化:虽然仍然是传递数组,但是数组的基类换成了字符串这样一种对象数据类型。Java程序将向C程序传入一个包含中文字符的字符串,C程序并没有处理这个字符串,而是开辟出一个新的字符串数组返回给Java程序,其中还包含两个汉字字符串。

Java程序的源代码如下。

代码清单15-10 在Linux平台上调用C函数的例程——Sample3

      public class Sample3

      {

       public native String[] stringMethod(String text);

     


      public static void main(String[] args) throws java.io.UnsupportedEncodingException

       {

         System.loadLibrary("Sample3");

           Sample3 sample = new Sample3();

           String[] texts = sample.stringMethod("java编程思想");

       for(int i=0;i<texts.length;i++)

        {

         texts[i]=new String(texts[i].getBytes("ISO8859-1"),"GBK");

          System.out.print( texts[i] );

       }

       System.out.println();

   }

    }

Sample3.java调用libSample3.so中的函数stringMethod()。Sample3.c的源代码如下:

代码清单15-11 在Linux平台上调用C函数的例程——Sample3.c

       #include <Sample3.h>

      #include <string.h>

      #include <stdlib.h>

      

      #define ARRAY_LENGTH 5
    

     JNIEXPORT jobjectArray JNICALL Java_Sample3_stringMethod(JNIEnv *env, jobject obj, jstring string)

       {  

          jclass objClass = (*env)->FindClass(env, "java/lang/String");

       jobjectArray texts= (*env)->NewObjectArray(env, (jsize)ARRAY_LENGTH, objClass, 0);

       jstring jstr;

        char* sa[] = { "Hello,", "world!", "JNI", "很", "好玩" };

       int i=0;

       for(;i<ARRAY_LENGTH;i++)

        {

          jstr = (*env)->NewStringUTF( env, sa[i] );

         (*env)->SetObjectArrayElement(env, texts, i, jstr);//必须放入jstring

       }

       return texts;

   }

第9、10行是我们需要特别关注的地方:JNI框架并 没有定义专门的字符串数组,而是使用jobjectArray——对象数组,对象数组的基类是jclass,jclass是JNI框架内特有的类型,相当 于Java语言中的Class类型。在本例程中,通过FindClass()函数在JNI上下文中获取到java.lang.String的类型 (Class),并将其赋予jclass变量。

在例程中我们定义了一个长度为5的对象数组texts,并在程序的第18行向其中循环放入预先定义好的sa数组中的字符串,当然前置条件是使用NewStringUTF()函数将C语言的字符串转换为jstring类型。

本例程的另一个关注点是C程序向Java程序传递的中文字符,在Java程序中能否正常显 示的问题。在笔者的试验环境中,Sample3.c是在Linux平台上编辑的,其中的中文字符则是用支持GBK的输入法输入的,而Java程序采用 ISO8859_1字符集存放JNI调用的返回字符,因此在“代码清单15-10在Linux平台上调用C函数的例程——Sample3”的第14行中将 其转码后输出。

4.传递对象数组
本节例程演示的是C程序向Java程序传递对象数组,而且对象数组中存放的不再是字符串,而是一个在Java中自定义的、含有一个topic属性的MailInfo对象类型。

MailInfo对象定义如下。

代码清单15-12 在Linux平台上调用C函数的例程——MailInfo

     public class MailInfo {

      public String topic;

     public String getTopic()

    {

         return this.topic;

      }


public void setTopic(String topic)

   {

    this.topic=topic;

   }

   }

Java程序的源代码如下。

代码清单15-13 在Linux平台上调用C函数的例程——Sample4

       public class Sample4

      {

      public native MailInfo[] objectMethod(String text);

      public static void main(String[] args)

      {

          System.loadLibrary("Sample4");

        Sample4 sample = new Sample4();

          MailInfo[] mails = sample.objectMethod("Thinking In Java");

       for(int i=0;i<mails.length;i++)

         System.out.println(mails[i].topic);

   }

}

Sample4.java调用libSample4.so中的objectMethod()函数。Sample4.c的源代码如下。

代码清单15-14 在Linux平台上调用C函数的例程——Sample4.c

       #include <Sample4.h>

     #include <string.h>

      #include <stdlib.h>

    

      #define ARRAY_LENGTH 5

   

      JNIEXPORT jobjectArray JNICALL Java_Sample4_objectMethod(JNIEnv *env, jobject obj, jstring string)

       { 

         jclass objClass = (*env)->FindClass(env, "java/lang/Object");

       jobjectArray mails= (*env)->NewObjectArray(env, (jsize)ARRAY_LENGTH, objClass, 0);


       jclass objectClass = (*env)->FindClass(env, "MailInfo");

       jfieldID topicFieldId = (*env)->GetFieldID(env, objectClass, "topic", "Ljava/lang/String;");

   


       int i=0;

       for(;i<ARRAY_LENGTH;i++)

    {

      (*env)->SetObjectField(env, obj, topicFieldId, string);

         (*env)->SetObjectArrayElement(env, mails, i, obj);

       }

     


    return mails;

   }

程序的第9、10行读者们应该不会陌生,在上一节的例 程中已经出现过,不同之处在于这次通过FindClass()函数在JNI上下文中获取的是java.lang.Object的类型(Class),并将 其作为基类开辟出一个长度为5的对象数组,准备用来存放MailInfo对象。

程序的第12、13行的目的则是创建一个jfieldID类型的变量,在JNI中,操作对 象属性都是通过jfieldID进行的。第12行首先查找得到MailInfo的类型(Class),然后基于这个jclass进一步获取其名为 topic的属性,并将其赋予jfieldID变量。

程序的第18、19行的目的是循环向对象数组中放入jobject对象。 SetObjectField()函数属于首次使用,该函数的作用是向jobject的属性赋值,而值的内容正是Java程序传入的jstring变量 值。请注意在向对象属性赋值和向对象数组中放入对象的过程中,我们使用了在函数头部分定义的jobject类型的环境参数obj作为中介。至此,JNI框 架固有的两个环境入参env和obj,我们都有涉及。

5.传递byte[]
源C
int SmsSend(char *phonenum,char *contnet);
java的native本地
public native static int SmsSend(byte[] mobileNo,byte[] smContent);
JNIEXPORT jint JNICALL Java_Sample5_objectMethod(JNIEnv *env, jclass jobject, jbyteArray mobileno,jbyteArray smscontent){
char *pSmscontent;
//jsize *theArrayLengthJ=(*env)->GetArrayLength(env,mobileno);
jbyte *arrayBody=(*env)->GetByteArrayElements(env,moblieno,0);
char *pMobileNo=(char *)arrayBody;
printf("[%s]\n,pMobileNo);
//jsize *theArrayLengthJ=(*env)->GetArrayLength(env,smscontent);
arrayBody=(*env)->GetByteArrayElements(env,smscontent,0);
pSmscontent=(char *)arrayBody;
printf("[%s]\n,pSmscontent);
return SmsSend(pMobileNo,pSmscontent);

Java语言支持两种成员(field):(static)静态成员和实例成员. 在JNI获取和赋值成员
的方法是不同的.
Java:
class InstanceFieldAccess {
private String s;
private native void accessField();
public static void main(String args[]) {
InstanceFieldAccess c = new InstanceFieldAccess();
c.s = "abc";
c.accessField();
System.out.println("In Java:");
System.out.println(" c.s = \"" + c.s + "\"");
}
static {
System.loadLibrary("InstanceFieldAccess");
}
}
JNI:
JNIEXPORT void JNICALL
Java_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
jstring jstr;
const char *str;
/* Get a reference to obj’s class */
jclass cls = (*env)->GetObjectClass(env, obj);
printf("In C:\n");
/* Look for the instance field s in cls */
fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
if (fid == NULL) {
return; /* failed to find the field */
}
/* Read the instance field s */
jstr = (*env)->GetObjectField(env, obj, fid);
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL) {
return; /* out of memory */
}
printf(" c.s = \"%s\"\n", str);
(*env)->ReleaseStringUTFChars(env, jstr, str);
/* Create a new string and overwrite the instance field */
jstr = (*env)->NewStringUTF(env, "123");
if (jstr == NULL) {
return; /* out of memory */
}
(*env)->SetObjectField(env, obj, fid, jstr);
}
输出:
In C:
c.s = "abc"
In Java:
c.s = "123"
访问对象成员分两步,首先通过GetFieldID得到对象成员ID, 如下:
fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");
示例代码,通过GetObjectClass从obj对象得到cls.
这时,通过在对象上调用下述方法获得成员的值:
jstr = (*env)->GetObjectField(env, obj, fid);
示例中要得到的是一个对象类型,所以用GetObjectField. 此外JNI还提供
Get/SetIntField,Get/SetFloatField访问不同类型成员。
Java:
class StaticFielcdAccess {
private static int si;
private native void accessField();
public static void main(String args[]) {
StaticFieldAccess c = new StaticFieldAccess();
StaticFieldAccess.si = 100;
c.accessField();
System.out.println("In Java:");
System.out.println(" StaticFieldAccess.si = " + si);
}
static {
System.loadLibrary("StaticFieldAccess");
}
}
JNI:
JNIEXPORT void JNICALL
Java_StaticFieldAccess_accessField(JNIEnv *env, jobject obj)
{
jfieldID fid; /* store the field ID */
jint si;
/* Get a reference to obj’s class */
jclass cls = (*env)->GetObjectClass(env, obj);
printf("In C:\n");
/* Look for the static field si in cls */
fid = (*env)->GetStaticFieldID(env, cls, "si", "I");
if (fid == NULL) {
return; /* field not found */
}
/* Access the static field si */
si = (*env)->GetStaticIntField(env, cls, fid);
printf(" StaticFieldAccess.si = %d\n", si);
(*env)->SetStaticIntField(env, cls, fid, 200);
}
输出:
In C:
StaticFieldAccess.si = 100
In Java:
StaticFieldAccess.si = 200
Java中有三类方法:实例方法、静态方法和构造方法。
class InstanceMethodCall {
private native void nativeMethod();
private void callback() {
System.out.println("In Java");
}
public static void main(String args[]) {
InstanceMethodCall c = new InstanceMethodCall();
c.nativeMethod();
}
static {
System.loadLibrary("InstanceMethodCall");
}
}
JNIEXPORT void JNICALL
Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj)
{
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "()V");
if (mid == NULL) {
return; /* method not found */
}
printf("In C\n");
(*env)->CallVoidMethod(env, obj, mid);
}
输出:
In C
In Java
如上节示例,回调Java方法分两步:
• 首先通过GetMethodID在给定类中查询方法. 查询基于方法名称和签名
• 本地方法调用CallVoidMethod,该方法表明被调Java方法的返回值为void
译者:
从JNI调用实例方法命名规则:Call<Return Value Type>Method
Calling Static Methods
同实例方法,回调Java静态方法分两步:
• 首先通过GetStaticMethodID在给定类中查找方法
• 通过CallStatic<ReturnValueType>Method调用
静态方法与实例方法的不同,前者传入参数为jclass,后者为jobject
Calling Instance Methods of a Superclass
调用被子类覆盖的父类方法: JNI支持用CallNonvirtual<Type>Method满足这类需求:
• GetMethodID获得method ID
• 调用CallNonvirtualVoidMethod, CallNonvirtualBooleanMethod
上述,等价于如下Java语言的方式:
super.f();
CallNonvirtualVoidMethod可以调用构造函数
Invoking Constructors
你可以像调用实例方法一样,调用构造方法,只是此时构造函数的名称叫做"<init>". 如
下构造java.lang.String对象(JNI为了方便有个对应的NewString做下面所有工作,这里
只是做示例展示):
jstring
MyNewString(JNIEnv *env, jchar *chars, jint len)
{
jclass stringClass;
jmethodID cid;
jcharArray elemArr;
jstring result;
stringClass = (*env)->FindClass(env, "java/lang/String");
if (stringClass == NULL) {
return NULL; /* exception thrown */
}
/* Get the method ID for the String(char[]) constructor */
cid = (*env)->GetMethodID(env, stringClass, "<init>", "([C)V");
if (cid == NULL) {
return NULL; /* exception thrown */
}
/* Create a char[] that holds the string characters */
elemArr = (*env)->NewCharArray(env, len);
if (elemArr == NULL) {
return NULL; /* exception thrown */
}
(*env)->SetCharArrayRegion(env, elemArr, 0, len, chars);
/* Construct a java.lang.String object */
result = (*env)->NewObject(env, stringClass, cid, elemArr);
/* Free local references */
(*env)->DeleteLocalRef(env, elemArr);
(*env)->DeleteLocalRef(env, stringClass);
return result;
}
首先,FindClass找到java.lang.String的jclass. 接下来,用GetMethodID找到构造
函数String(char[] chars)的MethodID. 此时用NewCharArray分配一个Char数组对象。
NewObject调用构造函数。
用DeleteLocalRef释放资源。
注意NewString是个常用函数,所以在JNI中直接被支持了,并且该函数的实现要比我们
实现的高效。
也可使用CallNonvirtualVoidMehtod调用构造函数. 如下代码:
result = (*env)->NewObject(env, stringClass, cid, elemArr);
可被替换为:
result = (*env)->AllocObject(env, stringClass);
if (result) {
(*env)->CallNonvirtualVoidMethod(env, result, stringClass, cid,
elemArr);
/* we need to check for possible exceptions */
if ((*env)->ExceptionCheck(env)) {
(*env)->DeleteLocalRef(env, result);
result = NULL;
}
}
AllocObject创建一个未初始化的对象,该函数必须在每个对象上被调用一次而且只能是
一次。
有时你会发现先创建未初始化对象再调用构造函数的方法是有用的。
Caching at the Point of Use
如下,首次使用时,缓存的局部静态变量中,避免每次调用计算。
JNIEXPORT void JNICALL
Java_InstanceFieldAccess_accessField(JNIEnv *env, jobject obj)
{
static jfieldID fid_s = NULL; /* cached field ID for s */
jclass cls = (*env)->GetObjectClass(env, obj);
jstring jstr;
const char *str;
if (fid_s == NULL) {
fid_s = (*env)->GetFieldID(env, cls, "s",
"Ljava/lang/String;");
if (fid_s == NULL) {
return; /* exception already thrown */
}
}
printf("In C:\n");
jstr = (*env)->GetObjectField(env, obj, fid_s);
str = (*env)->GetStringUTFChars(env, jstr, NULL);
if (str == NULL) {
return; /* out of memory */
}
printf(" c.s = \"%s\"\n", str);
(*env)->ReleaseStringUTFChars(env, jstr, str);
jstr = (*env)->NewStringUTF(env, "123");
if (jstr == NULL) {
return; /* out of memory */
}
(*env)->SetObjectField(env, obj, fid_s, jstr);
}
如上,静态变量fid_s保存了InstanceFieldAccess.s的filed ID。初始化阶段静态变量
被赋值为NULL。第一调用InstanceFieldAccess.accessField时,缓存fieldID以待后用。
你可能会发现上述代码有个竞争条件,当多个线程同时访问此函数时,可能会同时计算一
个field ID. 没关系,此处的竞争是无害的,因为即使在多个线程中同时计算该field
ID,各线程中的计算结果都是一样的。
构造函数的MethodID也可被缓存,如下:
jstring
MyNewString(JNIEnv *env, jchar *chars, jint len)
{
jclass stringClass;
jcharArray elemArr;
static jmethodID cid = NULL;
jstring result;
stringClass = (*env)->FindClass(env, "java/lang/String");
if (stringClass == NULL) {
return NULL; /* exception thrown */
}
/* Note that cid is a static variable */
if (cid == NULL) {
/* Get the method ID for the String constructor */
cid = (*env)->GetMethodID(env, stringClass,
"<init>", "([C)V");
if (cid == NULL) {
return NULL; /* exception thrown */
}
}
/* Create a char[] that holds the string characters */
elemArr = (*env)->NewCharArray(env, len);
if (elemArr == NULL) {
return NULL; /* exception thrown */
}
(*env)->SetCharArrayRegion(env, elemArr, 0, len, chars);
/* Construct a java.lang.String object */
result = (*env)->NewObject(env, stringClass, cid, elemArr);
/* Free local references */
(*env)->DeleteLocalRef(env, elemArr);
(*env)->DeleteLocalRef(env, stringClass);
return result;
}
分享到:
评论

相关推荐

    JNI接口开发

    2. 参数转换 a) 将java参数类型转换为jni提供的类型,包含:基础类型转换为jint,jlong,jboolean,jbyte等类型;String 转换为jstring类型;其他内置类型及自定义类型全部转换为jobject; 一般情况下,java调用...

    JNI完全技术手册 带完整书签

    Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good) 19 Chap6: JNI传递返回值... 26 15.2.2.3 传递字符串... 28 15.2.2.4 传递...

    JNI-array-arg.rar_JNI-array-arg_jni_jni 数组_jni array

    JNI数组参数传递,在使用JNI编程时注意转换参数,尤其是数组的出入与传出。

    JNI 转换方法。java转C结构体,C转java。

    1.int、int[]、byte、byte[]的转换。 2.jni实体类的转换,获取java实体类数据,并将参数传给C结构体。

    JNI调用大全

    Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:jni教程(very very good) 19 Chap6: JNI传递返回值... 26 15.2.2.3 传递字符串... 28 15.2.2.4 传递整型数组...

    前台java 后台c 结合技术----JNI.docx

    综上所述:先从c中得到dll文件,加在java后台里,相当于给java加了的本地方法或者接口,即可调用c的方法,后面再进阶学参数转换和方法调用。 接下来先搭建环境,测试下jni,最后再写开始写页面和看源码,因为我习惯...

    JNI文档资料源码_2020_01_28_2.zip

    【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104103097 I...

    JNI技术手册 c/c++调用java

    2) 如何将java传入的String参数转换为c的char*,然后使用? 57 3) 将c中获取的一个char*的buffer传递给java? 57 4) 不知道占用多少空间的buffer,如何传递出去呢? 58 五、 对JAVA传入数据的处理 58 1) 如果传入的是...

    IKVM7.4.5196.0,将java的jar包转换为.dll控件,以使.NET可以使用

    将java的jar包转换为.dll控件 使用的命令:ikvmc -out:XXXX.dll XXXX.jar 其中XXXX.dll为将要生成的.dll控件文件名,用于C#引用;XXXX.jar为JAVA打包好的jar包文件。 ikvmc [ options ] classOrJarfile [ ...

    java 调用windows API

    使用jinvoke.jar可以直接调用windows的api函数,如果用jni的话需要写c代码和参数转换

    Java与C语言混合开发技术

    在原理方面,首先介绍了混合编程模型,包括JNI技术和数据类型转换。由于Java和C语言的数据类型系统不同,需要进行数据类型的转换,例如将Java中的字符串类型转换为C语言中的字符数组,而C语言中的整数类型转换为Java...

    IKVM7.3.4830.0,将java的jar包转换为.dll控件,以使.NET可以使用

    将java的jar包转换为.dll控件 使用的命令:ikvmc -out:XXXX.dll XXXX.jar 其中XXXX.dll为将要生成的.dll控件文件名,用于C#引用;XXXX.jar为JAVA打包好的jar包文件。 ikvmc [ options ] classOrJarfile [ ...

    java c 之间参数与方法的调用

    java 代码与c代码之间参数以及方法在调用时的转换

    基于OpenCV传统图像处理实现的美颜算法相机C源码+sln及说明(可美白和磨皮).zip

    3. 支持三个参数: 美白,磨皮,简化模式 4. 提供C++、纯C、JNI接口 5. 特点:高性能,算法本身就是基于yuv的原地操作。没有与rgb的转换和内存的拷贝。 二. 算法流程 1. 计算和与平方和的积分图 2. 局部均方差滤波...

    jdk1.8.0_181(64位).7z

    2、集合 新java.util.stream包中的类提供Stream API以支持对元素流的功能样式操作。Stream API集成到Collections API中,可以对集合进行批量操作,例如顺序或并行map-reduce转换。 具有关键冲突的HashMaps的性能...

    OPhone平台2D游戏引擎实现——物理引擎

    该引擎通过用户设定的参数如重力,密度,摩擦,弹性等参数计算碰撞,角度,力和动力等。这些计算需要大量的数学,物理等知识,如果有兴趣也可以下载其源码来研究。 Box2d同时也提供了各种语言环境的实现,由于Ophone...

    char *转 jstring

    C++调用java java调用C++ 字符串参数传递 类型的转换

    InlineHook:目前支持32位android系统,thumb-2,arm指令集的hook

    直接将jni目录克隆下来,使用ndk-build编译即可使用共享库该演示修改ModifyIBored函数里GetModuleBaseAddr的参数,选择需要挂钩的so模块找到需要hook的指令地址,计算转换(指令的内存地址-指令所在模块的基址),...

    rainier:Scala中的贝叶斯推断

    使用惯用的功能性Scala构建模型,以构成原始分布和数学转换。 建立后,您可以根据观察到的数据对模型进行条件调整,以推断参数值的后验分布,然后使用该后验分布生成决策和预测。 这个高级API的基础是静态的...

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

Global site tag (gtag.js) - Google Analytics