jni 形參以及返回值

原網(wǎng)頁(yè):http://www.blogjava.net/china-qd/archive/2006/04/29/44002.html
Jni中C++和Java的參數(shù)傳遞

如何使用JNI的一些基本方法和過(guò)程在網(wǎng)上多如牛毛宪塔,如果你對(duì)Jni不甚了解,不知道Jni是做什么的换薄,如何建立一個(gè)基本的jni程序苛白,或許可以參考下面下面這些文章:
利用VC++6.0實(shí)現(xiàn)JNI的最簡(jiǎn)單的例子
JNI入門教程之HelloWorld篇
SUN JNI Tutorial

這些資料的例子中位谋,大多數(shù)只是輸入一些簡(jiǎn)單的參數(shù)多柑,獲取沒(méi)有參數(shù)论衍。而在實(shí)際的使用過(guò)程中瑞佩,往往需要對(duì)參數(shù)進(jìn)行處理轉(zhuǎn)換。才可以被C/C++程序識(shí)別坯台。比如我們?cè)贑++中有一個(gè)結(jié)構(gòu)(Struct)DiskInfo ,需要傳遞一個(gè)類似于DiskInfo *pDiskInfo的參數(shù)炬丸,類似于在C++這樣參數(shù)如何傳遞到Java中呢?下面我們就來(lái)討論C++到Java中方法的一些常見(jiàn)參數(shù)的轉(zhuǎn)換:
定義Native Java類:

如果你習(xí)慣了使用JNI蜒蕾,你就不會(huì)覺(jué)得它難了稠炬。既然本地方法是由其他語(yǔ)言實(shí)現(xiàn)的焕阿,它們?cè)贘ava中沒(méi)有函數(shù)體。但是首启,所有本地代碼必須用本地關(guān)鍵詞聲明暮屡,成為Java類的成員。假設(shè)我們?cè)贑++中有這么一個(gè)結(jié)構(gòu)毅桃,它用來(lái)描述硬盤信息:
// 硬盤信息
struct {
char name[ 256 ];
int serial;
} DiskInfo;
那么我們需要在Java中定義一個(gè)類來(lái)與之匹配褒纲,聲明可以寫成這樣:
class DiskInfo {
// 名字
public String name;

 // 序列號(hào) 
  public   int  serial;

}
在這個(gè)類中,申明一些Native的本地方法疾嗅,來(lái)測(cè)試方法參數(shù)的傳遞外厂,分別定義了一些函數(shù),用來(lái)傳遞結(jié)構(gòu)或者結(jié)構(gòu)數(shù)組代承,具體定義如下面代碼:
/* ***************** 定義本地方法 ******************* */
// 輸入常用的數(shù)值類型(Boolean,Byte,Char,Short,Int,Float,Double)
public native void displayParms(String showText, int i, boolean bl);

 // 調(diào)用一個(gè)靜態(tài)方法 
  public  native  int  add( int  a,  int  b);

 // 輸入一個(gè)數(shù)組 
  public  native  void  setArray(boolean[] blList);

 // 返回一個(gè)字符串?dāng)?shù)組 
  public  native String[] getStringArray();

 // 返回一個(gè)結(jié)構(gòu) 
  public  native DiskInfo getStruct();

 // 返回一個(gè)結(jié)構(gòu)數(shù)組 
  public  native DiskInfo[] getStructArray();

編譯生成C/C++頭文件

定義好了Java類之后汁蝶,接下來(lái)就要寫本地代碼。本地方法符號(hào)提供一個(gè)滿足約定的頭文件论悴,使用Java工具Javah可以很容易地創(chuàng)建它而不用手動(dòng)去創(chuàng)建掖棉。你對(duì)Java的class文件使用javah命令,就會(huì)為你生成一個(gè)對(duì)應(yīng)的C/C++頭文件膀估。
1幔亥、在控制臺(tái)下進(jìn)入工作路徑,本工程路徑為:E:\work\java\workspace\JavaJni察纯。
2帕棉、運(yùn)行javah 命令:javah -classpath E:\work\java\workspace\JavaJni com.sundy.jnidemo ChangeMethodFromJni
本文生成的C/C++頭文件名為: com_sundy_jnidemo_ChangeMethodFromJni.h

在C/C++中實(shí)現(xiàn)本地方法

生成C/C++頭文件之后,你就需要寫頭文件對(duì)應(yīng)的本地方法饼记。注意:所有的本地方法的第一個(gè)參數(shù)都是指向JNIEnv結(jié)構(gòu)的香伴。這個(gè)結(jié)構(gòu)是用來(lái)調(diào)用JNI函數(shù)的。第二個(gè)參數(shù)jclass的意義具则,要看方法是不是靜態(tài)的(static)或者實(shí)例(Instance)的即纲。前者,jclass代表一個(gè)類對(duì)象的引用博肋,而后者是被調(diào)用的方法所屬對(duì)象的引用低斋。
返回值和參數(shù)類型根據(jù)等價(jià)約定映射到本地C/C++類型,如表JNI類型映射所示匪凡。有些類型膊畴,在本地代碼中可直接使用,而其他類型只有通過(guò)JNI調(diào)用操作病游。
表A
Java 類型 本地類型 描述
boolean jboolean C/C++8位整型
byte jbyte C/C++帶符號(hào)的8位整型
char jchar C/C++無(wú)符號(hào)的16位整型
short jshort C/C++帶符號(hào)的16位整型
int jint C/C++帶符號(hào)的32位整型
long jlong C/C++帶符號(hào)的64位整型e
float jfloat C/C++32位浮點(diǎn)型
double jdouble C/C++64位浮點(diǎn)型
Object jobject 任何Java對(duì)象巴比,或者沒(méi)有對(duì)應(yīng)java類型的對(duì)象
Class jclass Class對(duì)象
String jstring 字符串對(duì)象
Object[] jobjectArray 任何對(duì)象的數(shù)組
boolean[] jbooleanArray 布爾型數(shù)組
byte[] jbyteArray 比特型數(shù)組
char[] jcharArray 字符型數(shù)組
short[] jshortArray 短整型數(shù)組
int[] jintArray 整型數(shù)組
long[] jlongArray 長(zhǎng)整型數(shù)組
float[] jfloatArray 浮點(diǎn)型數(shù)組
double[] jdoubleArray 雙浮點(diǎn)型數(shù)組
※ JNI類型映射
使用數(shù)組:

JNI通過(guò)JNIEnv提供的操作Java數(shù)組的功能。它提供了兩個(gè)函數(shù):一個(gè)是操作java的簡(jiǎn)單型數(shù)組的,另一個(gè)是操作對(duì)象類型數(shù)組的轻绞。
因?yàn)樗俣鹊脑颍?jiǎn)單類型的數(shù)組作為指向本地類型的指針暴露給本地代碼佣耐。因此政勃,它們能作為常規(guī)的數(shù)組存取。這個(gè)指針是指向?qū)嶋H的Java數(shù)組或者Java數(shù)組的拷貝的指針兼砖。另外奸远,數(shù)組的布置保證匹配本地類型。
為了存取Java簡(jiǎn)單類型的數(shù)組讽挟,你就要要使用GetXXXArrayElements函數(shù)(見(jiàn)表B)懒叛,XXX代表了數(shù)組的類型。這個(gè)函數(shù)把Java數(shù)組看成參數(shù)耽梅,返回一個(gè)指向?qū)?yīng)的本地類型的數(shù)組的指針薛窥。
表B
函數(shù) Java 數(shù)組類型 本地類型
GetBooleanArrayElements jbooleanArray jboolean
GetByteArrayElements jbyteArray jbyte
GetCharArrayElements jcharArray jchar
GetShortArrayElements jshortArray jshort
GetIntArrayElements jintArray jint
GetLongArrayElements jlongArray jlong
GetFloatArrayElements jfloatArray jfloat
GetDoubleArrayElements jdoubleArray jdouble
JNI數(shù)組存取函數(shù)
當(dāng)你對(duì)數(shù)組的存取完成后,要確保調(diào)用相應(yīng)的ReleaseXXXArrayElements函數(shù)眼姐,參數(shù)是對(duì)應(yīng)Java數(shù)組和GetXXXArrayElements返回的指針诅迷。如果必要的話,這個(gè)釋放函數(shù)會(huì)復(fù)制你做的任何變化(這樣它們就反射到j(luò)ava數(shù)組)众旗,然后釋放所有相關(guān)的資源罢杉。
為了使用java對(duì)象的數(shù)組,你必須使用GetObjectArrayElement函數(shù)和SetObjectArrayElement函數(shù)贡歧,分別去get滩租,set數(shù)組的元素。GetArrayLength函數(shù)會(huì)返回?cái)?shù)組的長(zhǎng)度利朵。
使用對(duì)象

JNI提供的另外一個(gè)功能是在本地代碼中使用Java對(duì)象律想。通過(guò)使用合適的JNI函數(shù),你可以創(chuàng)建Java對(duì)象哗咆,get蜘欲、set 靜態(tài)(static)和實(shí)例(instance)的域,調(diào)用靜態(tài)(static)和實(shí)例(instance)函數(shù)晌柬。JNI通過(guò)ID識(shí)別域和方法姥份,一個(gè)域或方法的ID是任何處理域和方法的函數(shù)的必須參數(shù)。
表C列出了用以得到靜態(tài)(static)和實(shí)例(instance)的域與方法的JNI函數(shù)年碘。每個(gè)函數(shù)接受(作為參數(shù))域或方法的類澈歉,它們的名稱,符號(hào)和它們對(duì)應(yīng)返回的jfieldID或jmethodID屿衅。
表C
函數(shù) 描述
GetFieldID 得到一個(gè)實(shí)例的域的ID
GetStaticFieldID 得到一個(gè)靜態(tài)的域的ID
GetMethodID 得到一個(gè)實(shí)例的方法的ID
GetStaticMethodID 得到一個(gè)靜態(tài)方法的ID
※域和方法的函數(shù)
如果你有了一個(gè)類的實(shí)例埃难,它就可以通過(guò)方法GetObjectClass得到,或者如果你沒(méi)有這個(gè)類的實(shí)例,可以通過(guò)FindClass得到涡尘。符號(hào)是從域的類型或者方法的參數(shù)忍弛,返回值得到字符串,如表D所示考抄。
表D
Java 類型 符號(hào)
boolean Z
byte B
char C
short S
int I
long L
float F
double D
void V
objects對(duì)象 Lfully-qualified-class-name;L類名
Arrays數(shù)組 [array-type [數(shù)組類型
methods方法 (argument-types)return-type(參數(shù)類型)返回類型
※確定域和方法的符號(hào)

下面我們來(lái)看看细疚,如果通過(guò)使用數(shù)組和對(duì)象,從C++中的獲取到Java中的DiskInfo 類對(duì)象川梅,并返回一個(gè)DiskInfo數(shù)組:
//返回一個(gè)結(jié)構(gòu)數(shù)組疯兼,返回一個(gè)硬盤信息的結(jié)構(gòu)數(shù)組
JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray
(JNIEnv *env, jobject _obj)
{
//申明一個(gè)object數(shù)組
jobjectArray args = 0;

//數(shù)組大小
jsize        len = 5;

//獲取object所屬類,一般為ava/lang/Object就可以了
jclass objClass = (env)->FindClass("java/lang/Object");

//新建object數(shù)組
args = (env)->NewObjectArray(len, objClass, 0);

/* 下面為獲取到Java中對(duì)應(yīng)的實(shí)例類中的變量*/

//獲取Java中的實(shí)例類
jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");

//獲取類中每一個(gè)變量的定義
//名字
jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");
//序列號(hào)
jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");

//給每一個(gè)實(shí)例的變量付值,并且將實(shí)例作為一個(gè)object贫途,添加到objcet數(shù)組中
for(int  i=0; i < len; i++ )
{
    //給每一個(gè)實(shí)例的變量付值
    jstring jstr = WindowsTojstring(env,"我的磁盤名字是 D:");
    //(env)->SetObjectField(_obj,str,(env)->NewStringUTF("my name is D:"));
    (env)->SetObjectField(_obj,str,jstr);
    (env)->SetShortField(_obj,ival,10);

    //添加到objcet數(shù)組中
    (env)->SetObjectArrayElement(args, i, _obj);
}
//返回object數(shù)組
return args;

}

全部的C/C++方法實(shí)現(xiàn)代碼如下:
/*

  • 一縷陽(yáng)光(sundy)版權(quán)所有吧彪,保留所有權(quán)利。
    /
    /
    *
  • TODO Jni 中一個(gè)從Java到C/C++參數(shù)傳遞測(cè)試類
  • @author 劉正偉(sundy)
  • @see http://www.cnweblog.com/sundy
  • @see mailto:sundy26@126.com
  • @version 1.0
  • @since 2005-4-30
  • 修改記錄:
  • 日期 修改人 描述

*/
// JniManage.cpp : 定義 DLL 應(yīng)用程序的入口點(diǎn)丢早。
//
package com.sundy.jnidemo;

include "stdafx.h"

include <stdio.h>

include <math.h>

include "jni.h"

include "jni_md.h"

include "./head/Base.h"

include "head/wmi.h"

include "head/com_sundy_jnidemo_ChangeMethodFromJni.h" //通過(guò)javah –jni javactransfer 生成

include <stdio.h>

include "stdlib.h"

include "string.h"

pragma comment (lib,"BaseInfo.lib")

pragma comment (lib,"jvm.lib")

//硬盤信息
struct {
char name[256];
int serial;
}DiskInfo;
/BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
LPTSTR strName = new CHAR[256] ;
(
GetHostName)(strName);
printf("%s\n",strName);
delete [] strName;

return TRUE;

}/
//將jstring類型轉(zhuǎn)換成windows類型
char
jstringToWindows( JNIEnv env, jstring jstr );
//將windows類型轉(zhuǎn)換成jstring類型
jstring WindowsTojstring( JNIEnv
env, char* str );

//主函數(shù)
BOOL WINAPI DllMain(HANDLE hHandle, DWORD dwReason, LPVOID lpReserved)
{
return TRUE;
}
//輸入常用的數(shù)值類型 Boolean,Byte,Char,Short,Int,Float,Double
JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_displayParms
(JNIEnv env, jobject obj, jstring s, jint i, jboolean b)
{
const char
szStr = (env)->GetStringUTFChars(s, 0 );
printf( "String = [%s]\n", szStr );
printf( "int = %d\n", i );
printf( "boolean = %s\n", (b==JNI_TRUE ? "true" : "false") );
(env)->ReleaseStringUTFChars(s, szStr );
}

//調(diào)用一個(gè)靜態(tài)方法,只有一個(gè)簡(jiǎn)單類型輸出
JNIEXPORT jint JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_add
(JNIEnv *env, jobject, jint a, jint b)
{
int rtn = (int)(a + b);
return (jint)rtn;
}

////輸入一個(gè)數(shù)組,這里輸入的是一個(gè)Boolean類型的數(shù)組
JNIEXPORT void JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_setArray
(JNIEnv env, jobject, jbooleanArray ba)
{
jboolean
pba = (env)->GetBooleanArrayElements(ba, 0 );
jsize len = (env)->GetArrayLength(ba);
int i=0;
// change even array elements
for( i=0; i < len; i+=2 )
{
pba[i] = JNI_FALSE;
printf( "boolean = %s\n", (pba[i]==JNI_TRUE ? "true" : "false") );
}
(env)->ReleaseBooleanArrayElements(ba, pba, 0 );
}

////返回一個(gè)字符串?dāng)?shù)組
JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStringArray
(JNIEnv env, jobject)
{
jstring str;
jobjectArray args = 0;
jsize len = 5;
char
sa[] = { "Hello,", "world!", "JNI", "is", "fun" };
int i=0;
args = (env)->NewObjectArray(len,(env)->FindClass("java/lang/String"),0);
for( i=0; i < len; i++ )
{
str = (env)->NewStringUTF(sa[i] );
(env)->SetObjectArrayElement(args, i, str);
}
return args;
}

//返回一個(gè)結(jié)構(gòu),這里返回一個(gè)硬盤信息的簡(jiǎn)單結(jié)構(gòu)類型
JNIEXPORT jobject JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStruct
(JNIEnv env, jobject obj)
{
/
下面為獲取到Java中對(duì)應(yīng)的實(shí)例類中的變量*/

//獲取Java中的實(shí)例類
jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");

//獲取類中每一個(gè)變量的定義
//名字
jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");
//序列號(hào)
jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");


//給每一個(gè)實(shí)例的變量付值
(env)->SetObjectField(obj,str,(env)->NewStringUTF("my name is D:"));
(env)->SetShortField(obj,ival,10);

return obj;

}

//返回一個(gè)結(jié)構(gòu)數(shù)組姨裸,返回一個(gè)硬盤信息的結(jié)構(gòu)數(shù)組
JNIEXPORT jobjectArray JNICALL Java_com_sundy_jnidemo_ChangeMethodFromJni_getStructArray
(JNIEnv *env, jobject _obj)
{
//申明一個(gè)object數(shù)組
jobjectArray args = 0;

//數(shù)組大小
jsize        len = 5;

//獲取object所屬類,一般為ava/lang/Object就可以了
jclass objClass = (env)->FindClass("java/lang/Object");

//新建object數(shù)組
args = (env)->NewObjectArray(len, objClass, 0);

/* 下面為獲取到Java中對(duì)應(yīng)的實(shí)例類中的變量*/

//獲取Java中的實(shí)例類
jclass objectClass = (env)->FindClass("com/sundy/jnidemo/DiskInfo");

//獲取類中每一個(gè)變量的定義
//名字
jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");
//序列號(hào)
jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");

//給每一個(gè)實(shí)例的變量付值,并且將實(shí)例作為一個(gè)object香拉,添加到objcet數(shù)組中
for(int  i=0; i < len; i++ )
{
    //給每一個(gè)實(shí)例的變量付值
    jstring jstr = WindowsTojstring(env,"我的磁盤名字是 D:");
    //(env)->SetObjectField(_obj,str,(env)->NewStringUTF("my name is D:"));
    (env)->SetObjectField(_obj,str,jstr);
    (env)->SetShortField(_obj,ival,10);

    //添加到objcet數(shù)組中
    (env)->SetObjectArrayElement(args, i, _obj);
}
//返回object數(shù)組
return args;

}

//將jstring類型轉(zhuǎn)換成windows類型
char* jstringToWindows( JNIEnv env, jstring jstr )
{
int length = (env)->GetStringLength(jstr );
const jchar
jcstr = (env)->GetStringChars(jstr, 0 );
char* rtn = (char)malloc( length2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length2+1), NULL, NULL );
if( size <= 0 )
return NULL;
(env)->ReleaseStringChars(jstr, jcstr );
rtn[size] = 0;
return rtn;
}
//將windows類型轉(zhuǎn)換成jstring類型
jstring WindowsTojstring( JNIEnv
env, char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short * buffer = 0;
if( slen == 0 )
rtn = (env)->NewStringUTF(str );
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer = (unsigned short )malloc( length2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = (env)->NewString( (jchar*)buffer, length );
}
if( buffer )
free( buffer );
return rtn;
}

Java 測(cè)試native代碼
這沒(méi)有什么多說(shuō)的啦扬,看代碼吧
//主測(cè)試程序
public static void main(String[] args) {
ChangeMethodFromJni changeJni = new ChangeMethodFromJni();

    //輸入常用的數(shù)值類型(string int boolean)
    System.out
            .println("------------------輸入常用的數(shù)值類型(string int boolean)-----------");
    changeJni.displayParms("Hello World!", 100, true);

    //調(diào)用一個(gè)靜態(tài)方法
    System.out.println("------------------調(diào)用一個(gè)靜態(tài)方法-----------");
    int ret = changeJni.add(12, 20);
    System.out.println("The result is: " + String.valueOf(ret));

    //輸入一個(gè)數(shù)組
    System.out.println("------------------輸入一個(gè)數(shù)組-----------");
    boolean[] blList = new boolean[] { true, false, true };
    changeJni.setArray(blList);

    //返回一個(gè)字符串?dāng)?shù)組
    System.out.println("------------------返回一個(gè)字符串?dāng)?shù)組-----------");
    String[] strList = changeJni.getStringArray();
    for (int i = 0; i < strList.length; i++) {
        System.out.print(strList[i]);
    }
    System.out.println();

    System.out.println("------------------返回一個(gè)結(jié)構(gòu)-----------");

    //返回一個(gè)結(jié)構(gòu)
    DiskInfo disk = changeJni.getStruct();
    System.out.println("name:" + disk.name);
    System.out.println("Serial:" + disk.serial);

    //返回一個(gè)結(jié)構(gòu)數(shù)組

    System.out.println("------------------返回一個(gè)結(jié)構(gòu)數(shù)組 -----------");
    DiskInfo[] diskList = changeJni.getStructArray();
    for (int i = 0; i < diskList.length; i++) {
        System.out.println("name:" + diskList[i].name);
        System.out.println("Serial:" + diskList[i].serial);
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凫碌,隨后出現(xiàn)的幾起案子扑毡,更是在濱河造成了極大的恐慌,老刑警劉巖盛险,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞄摊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡苦掘,警方通過(guò)查閱死者的電腦和手機(jī)换帜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鹤啡,“玉大人惯驼,你說(shuō)我怎么就攤上這事〉莨澹” “怎么了祟牲?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)抖部。 經(jīng)常有香客問(wèn)我说贝,道長(zhǎng),這世上最難降的妖魔是什么慎颗? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任乡恕,我火速辦了婚禮言询,結(jié)果婚禮上傲宜,老公的妹妹穿的比我還像新娘运杭。我一直安慰自己,他們只是感情好蛋哭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布县习。 她就那樣靜靜地躺著,像睡著了一般谆趾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叛本,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天沪蓬,我揣著相機(jī)與錄音,去河邊找鬼来候。 笑死跷叉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的营搅。 我是一名探鬼主播云挟,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼转质!你這毒婦竟也來(lái)了园欣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤休蟹,失蹤者是張志新(化名)和其女友劉穎沸枯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赂弓,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绑榴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盈魁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翔怎。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杨耙,靈堂內(nèi)的尸體忽然破棺而出赤套,到底是詐尸還是另有隱情,我是刑警寧澤按脚,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布于毙,位于F島的核電站,受9級(jí)特大地震影響辅搬,放射性物質(zhì)發(fā)生泄漏唯沮。R本人自食惡果不足惜脖旱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望介蛉。 院中可真熱鬧萌庆,春花似錦、人聲如沸币旧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吹菱。三九已至巍虫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳍刷,已是汗流浹背占遥。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留输瓜,地道東北人瓦胎。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尤揣,于是被迫代替她去往敵國(guó)和親搔啊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 什么是JNI北戏? JNI 是java本地開發(fā)接口.JNI 是一個(gè)協(xié)議,這個(gè)協(xié)議用來(lái)溝通java代碼和外部的本地代碼(...
    a_tomcat閱讀 2,816評(píng)論 0 54
  • 花了幾天時(shí)間研究了下JNI负芋,基本上知道如何使用了。照我的觀點(diǎn)JNI還是不難的最欠,難得只是我們一份嘗試的心示罗。 學(xué)習(xí)過(guò)程...
    皇小弟閱讀 1,606評(píng)論 0 1
  • _ 聲明: 對(duì)原文格式以及內(nèi)容做了細(xì)微的修改和美化, 主要為了方便閱讀和理解 _ 一. 基礎(chǔ) Java Nativ...
    元亨利貞o閱讀 5,900評(píng)論 0 34
  • 有圖有真相有情懷贷币,一場(chǎng)酣暢淋漓的軍旅電影 原創(chuàng)布衣都督2017-10-18 美國(guó)軍事大片向來(lái)是行業(yè)標(biāo)桿元媚,但最近贴届,這...
    烽火征程閱讀 528評(píng)論 0 1
  • 2017年2月4日辩尊,農(nóng)歷初八秒旋。 上午有房產(chǎn)中介打電話說(shuō)要看房菜枷。這應(yīng)該是一年前網(wǎng)上發(fā)布的消息了铃芦。我們那個(gè)時(shí)候是想把房...
    易品販書閱讀 204評(píng)論 0 0