文件读取
stream=fopen("/sdcard/31.jpg","rb");
if(stream)
{
fread(pImageData[0],1,(lHeight*lHeight),stream);
LOGE(" fread pImageData");
}
fclose(stream);
注册时的方法
Field Descriptor | Java Language Type |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
对于复杂类型,字符串描述以“L”开头,以“;”结束,例如java中的String,在jni中的描述为"Ljava/lang/String;" 注意后面的分号不要少了Object 为 Ljava/lang/Object;
对于数组,以“[”开头,接类型描述,例如int[ ],在jni中的描述为“[I”;String[ ],对应为“[Ljava/lang/String;”;如果是数组维数增加一维,则"["增加一个,例如int[ ][ ],对应为“[[I”;
下面是连个例子
java中的方法为
public native int native_MyJni (String str,String str2,int in,boolean bol);
public native int native_Lomo (String strSrc,String strRes, String srcCfg, int [] intensity, int effect, boolean fisheye_effect, int timeout, int tag);
注册时
static JNINativeMethod methods[] = {
{"native_Lomo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[IIZII)I",
(void*)Java_com_example_android_simplejni_SimpleJNI_native_1Lomo},
{"native_MyJni","(Ljava/lang/String;Ljava/lang/String;IZ)I",
(void*)Java_com_example_android_simplejni_SimpleJNI_native_1MyJni}
};
函数 | Java数组类型 | 本地类型 |
GetBooleanArrayElements | jbooleanArray | jboolean |
GetByteArrayElements | jbyteArray | jbyte |
GetCharArrayElements | jcharArray | jchar |
GetShortArrayElements | jshortArray | jshort |
GetIntArrayElements | jintArray | jint |
GetLongArrayElements | jlongArray | jlong |
GetFloatArrayElements | jfloatArray | jfloat |
GetDoubleArrayElements |
下面写一下常用类型的转换
首先是常用的转换
将就string转换成 char*
(1) jstring js= env->NewStringUTF("Hello from JNI");
(2) char *str=(char *)env->GetStringUTFChars(js,NULL);
// sprintf(char_result, "%s likes %s.", "who", "you");
// LOGE("js= %s _____++++++ jss=%s ","hello",str);
(3) env->ReleaseStringUTFChars(js,str);
将char * 转换成 jtring
char* tmpstr = "return string succeeded";
env->SetIntArrayRegion(iArray, 0, 8, arry);
if (obj) {
env->DeleteLocalRef(obj);
}
jbyteArryay to byte *
byte *imgbufferYUV;
jsize len = env->GetArrayLength(attry);
env->GetByteArrayRegion(attry, 0, len, (jbyte *) imgbufferYUV);
jbytearray转c++byte数组
- jbyte
* arrayBody = env->GetByteArrayElements(data,0); - jsize
theArrayLengthJ = env->GetArrayLength(data); - BYTE
* starter = (BYTE *)arrayBody;
jbyteArray 转 c++中的BYTE[]
- //jbytearray
strIn - jbyte
* olddata = (jbyte*)env->GetByteArrayElements(strIn, 0); - jsize
oldsize = env->GetArrayLength(strIn); - BYTE*
bytearr = (BYTE*)olddata; - int
len = (int)oldsize;
jbyteArray 转 char *
char* 转jstring
- jstring
WindowsTojstring(JNIEnv* env, char* str_tmp) - {
jstring rtn=0; int slen = (int)strlen(str_tmp); unsigned short* buffer=0; if(slen == 0) { rtn = env->NewStringUTF(str_tmp); } else { int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0); buffer = (unsigned short*)malloc(length*2+1); if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length) > 0) { rtn = env->NewString((jchar*)buffer, length); } } if(buffer) { free(buffer); } return rtn; - }
下面这个没有用过,刚看到,也写进来,以后如果遇到可以验证下看。
jstring 转 char* 或者 const char*
- //
jstring str - const
char *key = env->GetStringUTFChars(str, 0); - //jboolean
isOffer - jsClient->modify(key,
isOffer); - env->ReleaseStringUTFChars(str,
key);
JNI 返回 jbyteArray
- JNIEXPORT
jbyteArray JNICALL Java_Test_getByteArray(JNIEnv *env, jobject obj) - {
jbyteArray firstMacArray = env->NewByteArray( 6 ); ...... jbyte *bytes = env->GetByteArrayElements( firstMacArray, 0); for ( int i = 0; i < sizeof( pAdapterInfo->Address ); i++ ) { bytes[ i ] = pAdapterInfo->Address[ i ]; } env->SetByteArrayRegion(firstMacArray, 0, 6, bytes ); return firstMacArray; - }
//jstring to char*
- char*
jstringTostring(JNIEnv* env, jstring jstr) - {
char* rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("utf-8"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode); jsize alen = env->GetArrayLength(barr); jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = (char*)malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements (barr, ba, 0); return rtn; - }
//char* to jstring
- jstring
stoJstring(JNIEnv* env, const char* pat) - {
- jclass
strClass = env->FindClass("Ljava/lang/String;"); - jmethodID
ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); - jbyteArray
bytes = env->NewByteArray(strlen(pat)); - env->SetByteArrayRegion(bytes,
0, strlen(pat), (jbyte*)pat); - jstring
encoding = env->NewStringUTF("utf-8"); - return
(jstring)env->NewObject(strClass, ctorID, bytes, encoding); - }
//将jstring类型转换成windows类型
- char*
jstringToWindows( JNIEnv *env, jstring jstr ) - {
- int
length = (env)->GetStringLength(jstr ); - const
jchar* jcstr = (env)->GetStringChars(jstr, 0 ); - char*
rtn = (char*)malloc( length*2+1 ); - int
size = 0; - size
= WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL ); - if(
size <= 0 ) - return
NULL; - (env)->ReleaseStringChars(jstr,
jcstr ); - rtn[size]
= 0; - return
rtn; - }
//将windows类型转换成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( length*2 + 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; - }
jni object的使用
每一个jni格式的dll中的object对应该java里面的一个类。
如下例有一个 ObjData类,类中有成员bData ,Len
public class ObjData {
}
//------------------------jni获得传过来的Object类型的变量objDataIn--------
jclass clazz =(env)->FindClass("ObjData");
//从传进来的对象中取出byte[]
- jfieldID
byteData = (env)->GetFieldID(clazz,"bData","[B"); - jbyteArray
pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn, byteData); - jsize
theArrayLeng = env->GetArrayLength(pDataIn);
//byte[]转为BYTE[]
//将BYTE数组转为jarray
- jbyte*
byte = (jbyte*)jDataOut; - jbyteArray
jarray = env->NewByteArray(theArrayLeng); - env->SetByteArrayRegion(jarray,
0, theArrayLeng, byte);
//给每一个实例的变量付值
- (env)->SetObjectField(objDataIn,byteData,jarray);
- (env)->SetIntField(objDataIn,pDataInLen,jDataInLen);
- (env)->ReleaseByteArrayElements
(pDataIn, arrayBody, 0);
jfieldID fid ;
env->SetObjectField( obj, fid, jstr) ;
http://consuela-zhao.iteye.com/blog/869532