#include
"
com_jni_jernymyjni.h
"
#include
"
stdio.h
"
//
printf
#include
"
string.h
"
//
strlen, memset...
#define
JNI_ERR_NULL_CLASS 0x10
#define
JNI_ERR_NULL_CHAR 0x11
#define
JNI_ERR_NULL_INT 0x12
#define
JNI_ERR_NULL_STR 0x13
#define
JNI_ERR_NULL_OBJ 0x14
#define
JNI_ERR_NULL_FIELD_CHAR 0x15
#define
JNI_ERR_NULL_FIELD_INT 0x16
#define
JNI_ERR_NULL_FIELD_OBJ 0x17
#define
JNI_ERR_NULL_STR_UTF_C 0x18
#define
JNI_ERR_NULL_OBJ_ARY_ELEMENT 0x19
#define
JNI_ERR_NULL_METHOD 0x20
#define
JNI_DBG printf("[C]-File:%s, Line:%d\n", __FILE__, __LINE__);
#define
JNI_ASSERT_P_RTN_VAR(var, rtn)\
if
(NULL
==
var)\
{\
printf(
"
[C]-File:%s, Line:%d, %s==NULL\n
"
, __FILE__, __LINE__, #var);\
return
rtn;\
}
#define
JNI_ASSERT_V_RTN_VAR(var, rtn)\
if
(
0
==
var)\
{\
printf(
"
[C]-File:%s, Line:%d, %s==NULL\n
"
, __FILE__, __LINE__, #var);\
return
rtn;\
}
FILE
*
fpJniDbg
=
NULL;
//
A[65], a[97]
//
(chA1 & (~0x20)) = tower, (chA1 | 0x20)upper
JNIEXPORT jchar JNICALL Java_com_jni_jernymyjni_GetChar
(JNIEnv
*
jpcEnv, jobject jcObj, jchar jchInput)
{
if
(jchInput
>=
'
a
'
&&
jchInput
<=
'
z
'
)
{
return
(jchInput
&
(
~
0x20
));
}
else
if
(jchInput
>=
'
A
'
&&
jchInput
<=
'
Z
'
)
{
return
(jchInput
|
0x20
);
}
return
0
;
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetChar
(JNIEnv
*
jpcEnv, jobject jcObj, jchar jchSet)
{
printf(
"
[C]-Line:%d-Java_com_jni_jernymyjni_SetChar-jchSet:%c\n
"
,
__LINE__, jchSet);
return
0
;
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_GetInt
(JNIEnv
*
jpcEnv, jobject jcObj, jint jnAdd1, jint jnAdd2)
{
return
(jnAdd1
+
jnAdd2);
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetInt
(JNIEnv
*
jpcEnv, jobject jcObj, jint jnSet)
{
printf(
"
[C]-Line:%d-Java_com_jni_jernymyjni_SetInt-jnSet:%d\n
"
,
__LINE__, jnSet);
return
0
;
}
JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_GetStr
(JNIEnv
*
jpcEnv, jobject jcObj)
{
char
*
pachStr
=
{
"
Jernymy jni test
"
};
return
(
*
jpcEnv)
->
NewStringUTF(jpcEnv, pachStr);
}
JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_PrcsStr
(JNIEnv
*
jpcEnv, jobject jcObj, jstring jsStr)
{
int
nLen
=
0
;
char
achBuf[
128
]
=
{
0
};
const
char
*
lpcstrGet
=
(
*
jpcEnv)
->
GetStringUTFChars(jpcEnv, jsStr,
0
);
nLen
=
strlen(lpcstrGet);
nLen
=
(nLen
>
127
)
?
127
: nLen;
strncpy(achBuf, lpcstrGet, nLen);
(
*
jpcEnv)
->
ReleaseStringUTFChars(jpcEnv, jsStr, lpcstrGet);
while
(nLen
--
)
{
//
swicth to upper, to lower (a &(~0x20))
achBuf[nLen]
=
achBuf[nLen]
|
0x20
;
}
return
(
*
jpcEnv)
->
NewStringUTF(jpcEnv, achBuf);
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStr
(JNIEnv
*
jpcEnv, jobject jcObj, jstring jsStr)
{
const
char
*
lpcstrGet
=
(
*
jpcEnv)
->
GetStringUTFChars(jpcEnv, jsStr,
0
);
JNI_ASSERT_P_RTN_VAR(lpcstrGet,
-
1
);
printf(
"
[C]-Line:%d-Java_com_jni_jernymyjni_SetStr-jsStr:%s\n
"
,
__LINE__, lpcstrGet);
//
release for memory
(
*
jpcEnv)
->
ReleaseStringUTFChars(jpcEnv, jsStr, lpcstrGet);
return
0
;
}
#define
CHAR_NUM 2
JNIEXPORT jcharArray JNICALL Java_com_jni_jernymyjni_GetCharArray
(JNIEnv
*
jpcEnv, jobject jcObj, jchar jchChar)
{
jobjectArray joArray
=
0
;
jchar achBuf[CHAR_NUM]
=
{
0
};
achBuf[
0
]
=
jchChar
&
(
~
0x20
);
//
'a'
achBuf[
1
]
=
jchChar
|
0x20
;
//
'A'
joArray
=
(
*
jpcEnv)
->
NewCharArray(jpcEnv, CHAR_NUM);
JNI_ASSERT_P_RTN_VAR(joArray, NULL);
(
*
jpcEnv)
->
SetCharArrayRegion(jpcEnv, joArray,
0
,
2
, achBuf);
return
joArray;
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetCharArray
(JNIEnv
*
jpcEnv, jobject jcObj, jcharArray jchCharArray)
{
jsize jsLen
=
(
*
jpcEnv)
->
GetArrayLength(jpcEnv, jchCharArray);
//
get array length
printf(
"
[C]-Line:%d-Java_com_jni_jernymyjni_SetCharArray-jsLen:%d,jchCharArray:%p\n
"
,
__LINE__, jsLen, jchCharArray);
return
0
;
}
JNIEXPORT jintArray JNICALL Java_com_jni_jernymyjni_GetIntArray
(JNIEnv
*
jpcEnv, jobject jcObj, jintArray jiAry1, jintArray jiAry2)
{
int
nIdx;
jint nSum[
10
]
=
{
0
};
jobjectArray joArray
=
0
;
jsize jsLen
=
(
*
jpcEnv)
->
GetArrayLength(jpcEnv, jiAry1);
//
get array length
jint
*
jpIAry1
=
(
*
jpcEnv)
->
GetIntArrayElements(jpcEnv, jiAry1,
0
);
//
get array element pointer
jint
*
jpIAry2
=
(
*
jpcEnv)
->
GetIntArrayElements(jpcEnv, jiAry2,
0
);
//
get array element pointer
//
the value is now valid, so return NULL
JNI_ASSERT_V_RTN_VAR(jsLen, NULL);
JNI_ASSERT_P_RTN_VAR(jpIAry1, NULL);
JNI_ASSERT_P_RTN_VAR(jpIAry2, NULL);
printf(
"
[C]-Line:%d-Java_com_jni_jernymyjni_GetIntArray-jiAry1 length:%d\n
"
,
__LINE__, jsLen);
joArray
=
(
*
jpcEnv)
->
NewIntArray(jpcEnv, jsLen);
JNI_ASSERT_P_RTN_VAR(joArray, NULL);
for
(nIdx
=
0
; nIdx
<
jsLen; nIdx
++
)
{
nSum[nIdx]
=
jpIAry1[nIdx]
+
jpIAry2[nIdx];
//
add every array element
printf(
"
[C]-nSum:%d=%d+%d\n
"
, nSum[nIdx], jpIAry1[nIdx], jpIAry2[nIdx]);
}
(
*
jpcEnv)
->
SetIntArrayRegion(jpcEnv, joArray,
0
, jsLen, nSum);
(
*
jpcEnv)
->
ReleaseIntArrayElements(jpcEnv, jiAry1, jpIAry1,
0
);
//
release, do not forget
(
*
jpcEnv)
->
ReleaseIntArrayElements(jpcEnv, jiAry2, jpIAry2,
0
);
//
release, do not forget
return
joArray;
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetIntArray
(JNIEnv
*
jpcEnv, jobject jcObj, jintArray jiAry1)
{
int
nIdx;
jsize jsLen
=
(
*
jpcEnv)
->
GetArrayLength(jpcEnv, jiAry1);
//
get array length
jint
*
jpIAry1
=
(
*
jpcEnv)
->
GetIntArrayElements(jpcEnv, jiAry1,
0
);
//
get array pointer
JNI_ASSERT_V_RTN_VAR(jsLen,
0
);
JNI_ASSERT_P_RTN_VAR(jpIAry1,
0
);
printf(
"
[C]-Line:%d-Java_com_jni_jernymyjni_GetIntArray-jiAry1 length:%d\n
"
,
__LINE__, jsLen);
for
(nIdx
=
0
; nIdx
<
jsLen; nIdx
++
)
{
printf(
"
[C]-Index:%d, jpIAry1:%d\n
"
, nIdx, jpIAry1[nIdx]);
}
(
*
jpcEnv)
->
ReleaseIntArrayElements(jpcEnv, jiAry1, jpIAry1,
0
);
//
release, do not forget
return
0
;
}
#define
JNI_STR_ARRAY_NUM 3
JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetStrArray
(JNIEnv
*
jpcEnv, jobject jcObj)
{
jstring jsStr
=
0
;
jclass jcStrCls
=
0
;
jobjectArray joArray
=
0
;
int
nIdx
=
0
;
char
*
pachStr[JNI_STR_ARRAY_NUM]
=
{
"
Jernymy
"
,
"
Jni
"
,
"
Test
"
};
jcStrCls
=
(
*
jpcEnv)
->
FindClass(jpcEnv,
"
java/lang/String
"
);
JNI_ASSERT_P_RTN_VAR(jcStrCls, NULL);
joArray
=
(
*
jpcEnv)
->
NewObjectArray(jpcEnv, JNI_STR_ARRAY_NUM, jcStrCls,
0
);
JNI_ASSERT_P_RTN_VAR(joArray, NULL);
for
(; nIdx
<
JNI_STR_ARRAY_NUM; nIdx
++
)
{
jsStr
=
(
*
jpcEnv)
->
NewStringUTF(jpcEnv, pachStr[nIdx]);
JNI_ASSERT_P_RTN_VAR(jsStr, NULL);
(
*
jpcEnv)
->
SetObjectArrayElement(jpcEnv, joArray, nIdx, jsStr);
}
return
joArray;
}
JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_PrcsStrArray
(JNIEnv
*
jpcEnv, jobject jcObj, jstring jsString)
{
jobjectArray joArray
=
0
;
jclass jcStrCls;
jstring jsCurStr;
const
char
*
lpcstrGet;
const
char
*
lpcstrBk;
char
*
pchStr;
char
achStrBuf[
128
]
=
{
0
};
int
nIndex
=
0
;
pchStr
=
achStrBuf;
#ifdef WIN32
//
OK success - win32 system
//
win32 "java/lang/String" and "Ljava/lang/String;" both OK
//
jclass jcStrCls = (*jpcEnv)->FindClass(jpcEnv, "java/lang/String");
jcStrCls
=
(
*
jpcEnv)
->
FindClass(jpcEnv,
"
Ljava/lang/String;
"
);
#else
//
linux here must "java/lang/String"
jcStrCls
=
(
*
jpcEnv)
->
FindClass(jpcEnv,
"
java/lang/String
"
);
/*
----get string array:
Exception in thread "main" java.lang.ClassNotFoundException: Ljava.lang.String; not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}}
at java.net.URLClassLoader.findClass(libgcj.so.7rh)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
[yewu@localhost src]$
*/
//
jclass jcStrCls = (*jpcEnv)->FindClass(jpcEnv, "Ljava/lang/String;");
#endif
JNI_ASSERT_P_RTN_VAR(jcStrCls, NULL);
joArray
=
(
*
jpcEnv)
->
NewObjectArray(jpcEnv,
3
, jcStrCls,
0
);
JNI_ASSERT_P_RTN_VAR(joArray, NULL);
lpcstrGet
=
(
*
jpcEnv)
->
GetStringUTFChars(jpcEnv, jsString,
0
);
JNI_ASSERT_P_RTN_VAR(lpcstrGet, NULL);
lpcstrBk
=
lpcstrGet;
printf(
"
[C]-lpcstrGet:%s\n
"
, lpcstrGet);
while
(
*
lpcstrGet)
{
if
(
'
'
==
*
lpcstrGet)
{
nIndex
++
;
lpcstrGet
++
;
printf(
"
[C]-achStrBuf:%s\n
"
, achStrBuf);
jsCurStr
=
(
*
jpcEnv)
->
NewStringUTF(jpcEnv, achStrBuf);
JNI_ASSERT_P_RTN_VAR(jsCurStr, NULL);
(
*
jpcEnv)
->
SetObjectArrayElement(jpcEnv, joArray, nIndex
-
1
, jsCurStr);
memset(
&
achStrBuf,
0
,
128
);
pchStr
=
&
achStrBuf[
0
];
}
else
{
*
pchStr
++
=
*
lpcstrGet
++
;
}
}
if
(achStrBuf[
0
])
{
printf(
"
[C]-achStrBuf:%s\n
"
, achStrBuf);
jsCurStr
=
(
*
jpcEnv)
->
NewStringUTF(jpcEnv, achStrBuf);
JNI_ASSERT_P_RTN_VAR(jsCurStr, NULL);
(
*
jpcEnv)
->
SetObjectArrayElement(jpcEnv, joArray, nIndex, jsCurStr);
}
(
*
jpcEnv)
->
ReleaseStringUTFChars(jpcEnv, jsString, lpcstrBk);
return
joArray;
}