锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
Java 綾誨瀷 鏈湴綾誨瀷 璇存槑
boolean jboolean 鏃犵鍙鳳紝8 浣?
byte jbyte 鏃犵鍙鳳紝8 浣?
char jchar 鏃犵鍙鳳紝16 浣?
short jshort 鏈夌鍙鳳紝16 浣?
int jint 鏈夌鍙鳳紝32 浣?
long jlong 鏈夌鍙鳳紝64 浣?
float jfloat 32 浣?
double jdouble 64 浣?
void void N/A
鐢變簬JVM涓紝浣跨敤緇熶竴鐨刄TF-8緙栫爜錛宩ava浼犲叆鐨凷tring鍙傛暟錛屽湪c鏂囦歡涓jni杞崲涓簀string鐨勬暟鎹被鍨嬶紝鍦╟鏂囦歡涓0鏄巆har* psz錛岀劧鍚巔sz = (char*)(*env)->GetStringUTFChars(env, jstring, NULL);c++鐨勬搷浣滅畝鍗曚簺錛宔nv->GetStringUTFChars( jstring, NULL);娉ㄦ剰浣跨敤瀹屽悗錛岃繍琛?*env)->ReleaseStringUTFChars(env, jstring, psz);
灝嗕竴涓猚鐨勫瓧絎︿覆杞負jstring錛?
static char lastfile[80];
JNIEXPORT jstring JNICALL Java_ReadFile_lastFile
(JNIEnv *env, jobject jobj) {
return((*env)->NewStringUTF(env, lastfile));
}
渚嬪瓙
JNIEXPORT jstring JNICALL
Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
{
char buf[128];
const jbyte *str;
str = (*env)->GetStringUTFChars(env, prompt, NULL);
if (str == NULL) {
return NULL; /* OutOfMemoryError already thrown */
}
printf("%s", str);
(*env)->ReleaseStringUTFChars(env, prompt, str);
/* We assume here that the user does not type more than
* 127 characters */
scanf("%s", buf);
return (*env)->NewStringUTF(env, buf);
}
濡傛灉浣跨敤Unicode緙栫爜錛屼笉闇瑕佷嬌鐢║TF-8澶勭悊錛屼嬌鐢ㄥ涓嬫柟娉?br />
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv * env, jobject jobj, jstring name) {
caddr_t m;
jbyteArray jb;
struct stat finfo;
jboolean iscopy;
const jchar *mfile = (*env)->GetStringChars(env,
name, &iscopy);
//...
(*env)->ReleaseStringChars(env, name, mfile);
浼犻扐rray
boolean
public static void setArray( boolean[] ba )
{
for( int i=0; i < ba.length; i++ )
ba[i] = true;
setArray0( ba );
}
private static native void setArray0( boolean[] ba );
甯冨皵鍨嬫暟緇勮鍒濆鍖栦負 true錛屾湰鍦版柟娉曞皢鎶婄壒瀹氱殑鍏冪礌璁劇疆涓?false銆傚悓鏃訛紝鍦?Java 婧愪唬鐮佷腑錛屾垜浠彲浠ユ洿鏀?main 浠ヤ嬌鍏跺寘鍚祴璇曚唬鐮侊細
boolean[] ba = new boolean[5];
MyNative.setArray( ba );
for( int i=0; i < ba.length; i++ )
System.out.println( ba[i] );
鍦ㄧ紪璇戞簮浠g爜騫舵墽琛?javah 浠ュ悗錛孧yNative.h 澶存枃浠跺寘鍚互涓嬬殑鍘熷瀷錛?/p>
/*
* Class: MyNative
* Method: setArray0
* Signature: ([Z)V
*/
JNIEXPORT void JNICALL Java_MyNative_setArray0
(JNIEnv *, jclass, jbooleanArray);
甯冨皵鍨嬫暟緇勬槸浣滀負鍗曚釜鍚嶄負 jbooleanArray 鐨勭被鍨嬪垱寤虹殑銆?
鍩烘湰綾誨瀷鏈夊畠浠嚜宸茬殑鏁扮粍綾誨瀷錛屽 jintArray 鍜?jcharArray銆?
闈炲熀鏈被鍨嬬殑鏁扮粍浣跨敤 jobjectArray 綾誨瀷銆備笅涓涓ず渚嬩腑鍖呮嫭涓涓?jobjectArray銆傝繖涓竷灝旀暟緇勭殑鏁扮粍鍏冪礌鏄氳繃 JNI 鏂規硶 GetBooleanArrayElements 鏉ヨ闂殑銆?
閽堝姣忕鍩烘湰綾誨瀷閮芥湁絳変環鐨勬柟娉曘傝繖涓湰鍦版柟娉曟槸濡備笅瀹炵幇鐨勶細
JNIEXPORT void JNICALL Java_MyNative_setArray0
(JNIEnv *env, jclass cls, jbooleanArray ba)
{
jboolean* pba = (*env)->GetBooleanArrayElements( env, ba, 0 );
jsize len = (*env)->GetArrayLength(env, ba);
int i=0;
// 鏇存敼鍋舵暟鏁扮粍鍏冪礌
for( i=0; i < len; i+=2 )
pba[i] = JNI_FALSE;
(*env)->ReleaseBooleanArrayElements( env, ba, pba, 0 );
}
鎸囧悜甯冨皵鍨嬫暟緇勭殑鎸囬拡鍙互浣跨敤 GetBooleanArrayElements 鑾峰緱銆?
鏁扮粍澶у皬鍙互鐢?GetArrayLength 鏂規硶鑾峰緱銆備嬌鐢?ReleaseBooleanArrayElements 鏂規硶閲婃斁鏁扮粍銆傚氨鍙互璇誨彇鍜屼慨鏀規暟緇勫厓绱犵殑鍊間簡銆?br />
int 鏁扮粍
class IntArray {
private native int sumArray(int[] arr);
public static void main(String[] args) {
IntArray p = new IntArray();
int arr[] = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
int sum = p.sumArray(arr);
System.out.println("sum = " + sum);
}
static {
System.loadLibrary("jnistudy");
}
}
jni鐨刢紼嬪簭
#include <jni.h>
#include <stdio.h>
#include "IntArray.h"
JNIEXPORT jint JNICALL
Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
{
jint *carr;
jint i, sum = 0;
carr = (*env)->GetIntArrayElements(env, arr, NULL);
if (carr == NULL) {
return 0; /* exception occurred */
}
for (i=0; i<10; i++) {
sum += carr[i];
}
(*env)->ReleaseIntArrayElements(env, arr, carr, 0);
return sum;
}
GetIntArrayRegion寰楀埌鏁扮粍錛孯eleaseIntArrayElements閲婃斁璧勬簮錛孏etArrayLength寰楀埌鏁扮粍鐨勯暱搴︼紝SetIntArrayRegion淇敼鏁扮粍鍏冪礌鐨勫箋?/p>
澶氫綅int 鏁扮粍
class ObjectArrayTest {
private static native int[][] initInt2DArray(int size);
public static void main(String[] args) {
int[][] i2arr = initInt2DArray(3);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(" " + i2arr[i][j]);
}
System.out.println();
}
}
static {
System.loadLibrary("jnistudy");
}
}
jni鐨勪唬鐮?br />
#include <jni.h>
#include <stdio.h>
#include "ObjectArrayTest.h"
JNIEXPORT jobjectArray JNICALL
Java_ObjectArrayTest_initInt2DArray(JNIEnv *env,
jclass cls,
jint size)
{
jobjectArray result;
int i;
jclass intArrCls = (*env)->FindClass(env, "[I");
if (intArrCls == NULL) {
return NULL; /* exception thrown */
}
result = (*env)->NewObjectArray(env, size, intArrCls, NULL);
if (result == NULL) {
return NULL; /* out of memory error thrown */
}
for (i = 0; i < size; i++) {
jint tmp[256]; /* make sure it is large enough! */
int j;
jintArray iarr = (*env)->NewIntArray(env, size);
if (iarr == NULL) {
return NULL; /* out of memory error thrown */
}
for (j = 0; j < size; j++) {
tmp[j] = i + j;
}
(*env)->SetIntArrayRegion(env, iarr, 0, size, tmp);
(*env)->SetObjectArrayElement(env, result, i, iarr);
(*env)->DeleteLocalRef(env, iarr);
}
return result;
}
Get/SetObjectArrayElement寰楀埌鍜岃緗暟緇勭殑鍏冪礌鐨勫箋?br />
浼犻?Java String 鏁扮粍
鏈緥灝嗛氳繃鏈甯哥敤鐨勯潪鍩烘湰綾誨瀷錛孞ava String錛岃鏄庡浣曡闂潪鍩烘湰瀵硅薄鐨勬暟緇勩傚瓧絎︿覆鏁扮粍琚紶閫掔粰鏈湴鏂規硶錛岃屾湰鍦版柟娉曞彧鏄皢瀹冧滑鏄劇ず鍒版帶鍒跺彴涓娿?
MyNative 綾誨畾涔変腑娣誨姞浜嗕互涓嬪嚑涓柟娉曪細
public static void showStrings( String[] sa )
{
showStrings0( sa );
}
private static void showStrings0( String[] sa );
嫻嬭瘯
String[] sa = new String[] { "Hello,", "world!", "JNI", "is", "fun." };
MyNative.showStrings( sa );
c浠g爜涓紝鏈湴鏂規硶鍒嗗埆璁塊棶姣忎釜鍏冪礌錛?/p>
JNIEXPORT void JNICALL Java_MyNative_showStrings0
(JNIEnv *env, jclass cls, jobjectArray sa)
{
int len = (*env)->GetArrayLength( env, sa );
int i=0;
for( i=0; i < len; i++ )
{
jobject obj = (*env)->GetObjectArrayElement(env, sa, i);
jstring str = (jstring)obj;
const char* szStr = (*env)->GetStringUTFChars( env, str, 0 );
printf( "%s ", szStr );
(*env)->ReleaseStringUTFChars( env, str, szStr );
}
printf( "\n" );
}
鏁扮粍鍏冪礌鍙互閫氳繃 GetObjectArrayElement 璁塊棶銆?鍥犱負榪斿洖鍊兼槸 jstring 綾誨瀷錛屾墍浠ュ彲浠ュ畨鍏ㄥ湴灝嗗畠浠?jobject 綾誨瀷杞崲涓?jstring 綾誨瀷銆?/p>
榪斿洖 Java String 鏁扮粍
鍦ㄦ湰鍦頒唬鐮佷腑鍒涘緩涓涓瓧絎︿覆鏁扮粍騫跺皢瀹冭繑鍥炵粰 Java 璋冪敤鑰呫侻yNative.java 涓坊鍔犱簡浠ヤ笅鍑犱釜鏂規硶錛?/p>
public static String[] getStrings()
{
return getStrings0();
}
private static native String[] getStrings0();
浣跨敤showStrings 灝?getStrings 鐨勮緭鍑烘樉紺哄嚭鏉ワ細
MyNative.showStrings( MyNative.getStrings() );
瀹炵幇鐨勬湰鍦版柟娉曡繑鍥炰簲涓瓧絎︿覆銆?/p>
JNIEXPORT jobjectArray JNICALL Java_MyNative_getStrings0
(JNIEnv *env, jclass cls)
{
jstring str;
jobjectArray args = 0;
jsize len = 5;
char* sa[] = { "Hello,", "world!", "JNI", "is", "fun" };
int i=0;
args = (*env)->NewObjectArray(env, len, (*env)->FindClass(env, "java/lang/String"), 0);
for( i=0; i < len; i++ )
{
str = (*env)->NewStringUTF( env, sa[i] );
(*env)->SetObjectArrayElement(env, args, i, str);
}
return args;
}
瀛楃涓叉暟緇勬槸閫氳繃璋冪敤 NewObjectArray 鍒涘緩鐨勶紝鍚屾椂浼犻掍簡 String 綾誨拰鏁扮粍闀垮害涓や釜鍙傛暟銆侸ava String 鏄嬌鐢?NewStringUTF 鍒涘緩鐨勩係tring 鍏冪礌鏄嬌鐢?SetObjectArrayElement 瀛樺叆鏁扮粍涓殑銆?br />
鍙﹀瑕侀氳繃jni鏉ユ敼鍙榡ava鐨勫弬鏁板紩鐢?渚嬪鏈夊弬鏁癹byteArray account錛屼慨鏀瑰畬account鐨勫煎悗錛宩ava瑕佽幏鍙栬鍊鹼紝鐩存帴浣跨敤
jbyte* jbAccount = (env)->GetByteArrayElements(env, account, 0);
char* szAccount = (char*)jbAccount;
鎸囬拡鐨勫湴鍧騫朵笉鏄痑ccount鐨勫湴鍧錛屾渶鍚庤祴涓嬪兼墠琛?br />
env->SetByteArrayRegion(account,0,strlen(szAccount),jbyte* jbAccount);
REMOTE_ADDR = 鎮ㄧ殑 IP
HTTP_VIA = 娌℃暟鍊兼垨涓嶆樉紺?br />
HTTP_X_FORWARDED_FOR = 娌℃暟鍊兼垨涓嶆樉紺?/p>
浜屻佷嬌鐢ㄩ忔槑浠g悊鏈嶅姟鍣ㄧ殑鎯呭喌錛歍ransparent Proxies
REMOTE_ADDR = 鏈鍚庝竴涓唬鐞嗘湇鍔″櫒 IP
HTTP_VIA = 浠g悊鏈嶅姟鍣?IP
HTTP_X_FORWARDED_FOR = 鎮ㄧ殑鐪熷疄 IP 錛岀粡榪囧涓唬鐞嗘湇鍔″櫒鏃訛紝榪欎釜鍊肩被浼煎涓嬶細203.98.182.163, 203.98.182.163, 203.129.72.215銆?/p>
榪欑被浠g悊鏈嶅姟鍣ㄨ繕鏄皢鎮ㄧ殑淇℃伅杞彂緇欐偍鐨勮闂璞★紝鏃犳硶杈懼埌闅愯棌鐪熷疄韜喚鐨勭洰鐨勩?/p>
涓夈佷嬌鐢ㄦ櫘閫氬尶鍚嶄唬鐞嗘湇鍔″櫒鐨勬儏鍐碉細Anonymous Proxies
REMOTE_ADDR = 鏈鍚庝竴涓唬鐞嗘湇鍔″櫒 IP
HTTP_VIA = 浠g悊鏈嶅姟鍣?IP
HTTP_X_FORWARDED_FOR = 浠g悊鏈嶅姟鍣?IP 錛岀粡榪囧涓唬鐞嗘湇鍔″櫒鏃訛紝榪欎釜鍊肩被浼煎涓嬶細203.98.182.163, 203.98.182.163, 203.129.72.215銆?/p>
闅愯棌浜嗘偍鐨勭湡瀹濱P錛屼絾鏄悜璁塊棶瀵硅薄閫忛湶浜嗘偍鏄嬌鐢ㄤ唬鐞嗘湇鍔″櫒璁塊棶浠栦滑鐨勩?/p>
鍥涖佷嬌鐢ㄦ楠楁т唬鐞嗘湇鍔″櫒鐨勬儏鍐碉細Distorting Proxies
REMOTE_ADDR = 浠g悊鏈嶅姟鍣?IP
HTTP_VIA = 浠g悊鏈嶅姟鍣?IP
HTTP_X_FORWARDED_FOR = 闅忔満鐨?IP 錛岀粡榪囧涓唬鐞嗘湇鍔″櫒鏃訛紝榪欎釜鍊肩被浼煎涓嬶細203.98.182.163, 203.98.182.163, 203.129.72.215銆?/p>
鍛婅瘔浜嗚闂璞℃偍浣跨敤浜嗕唬鐞嗘湇鍔″櫒錛屼絾緙栭犱簡涓涓櫄鍋囩殑闅忔満IP浠f浛鎮ㄧ殑鐪熷疄IP嬈洪獥瀹冦?/p>
浜斻佷嬌鐢ㄩ珮鍖垮悕浠g悊鏈嶅姟鍣ㄧ殑鎯呭喌錛欻igh Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 浠g悊鏈嶅姟鍣?IP
HTTP_VIA = 娌℃暟鍊兼垨涓嶆樉紺?br />
HTTP_X_FORWARDED_FOR = 娌℃暟鍊兼垨涓嶆樉紺?錛岀粡榪囧涓唬鐞嗘湇鍔″櫒鏃訛紝榪欎釜鍊肩被浼煎涓嬶細203.98.182.163, 203.98.182.163, 203.129.72.215銆?/p>
瀹屽叏鐢ㄤ唬鐞嗘湇鍔″櫒鐨勪俊鎭浛浠d簡鎮ㄧ殑鎵鏈変俊鎭紝灝辮薄鎮ㄥ氨鏄畬鍏ㄤ嬌鐢ㄩ偅鍙頒唬鐞嗘湇鍔″櫒鐩存帴璁塊棶瀵硅薄銆?/p>