80,337
社区成员
发帖
与我相关
我的任务
分享
package com.jni;
import android.app.Activity;
import android.os.Bundle;
public class AndroidJni extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
package com.jni;
// jernymy use c style for var name
public class jernymyjni {
char chChar; // char use ch token
// short wShort; // short use w token, short same as int
int nInt; // int use n token
String sString; // String use s token
/*-------- jernymy for base type declaration start --------*/
/*
* The char process method GetChar
* @param char chInput : the input char for process
* @return(char) : input char (chInput) upper or lower
* @author : jernymy
* @date : 20110508
* */
public native char GetChar(char chInput);
/*
* The char process method SetChar
* @param char chInput : set the input char
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetChar(char chInput);
/*
* The int process method GetInt
* @param int nAdd1 : add one
* @param int nAdd2 : add other
* @return(int) : sum of two add var
* @author : jernymy
* @date : 20110508
* */
public native int GetInt(int nAdd1, int nAdd2);
/*
* The int process method SetInt
* @param int nSet : set one int data
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetInt(int nSet);
/*
* The String process method GetStr
* @return(String) : the string for use
* @author : jernymy
* @date : 20110508
* */
public native String GetStr();
/*
* The String process method PrcsStr
* @param String sInput : the input String for process
* @return(String) : the process of the input String
* @author : jernymy
* @date : 20110508
* */
public native String PrcsStr(String sInput);
/*
* The String process method PrcsStr
* @param String sSet : the set String
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetStr(String sSet);
/*-------- jernymy for base type declaration end --------*/
/*-------- jernymy for array type declaration start --------*/
/*
* The char array process method GetCharArray
* @param char chSet : the chSet char for process
* @return(char[]) : char array, upper and lower
* @author : jernymy
* @date : 20110508
* */
public native char[] GetCharArray(char chSet);
/*
* The char array process method SetCharArray
* @param char[] chSet : the chSet char array for process
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetCharArray(char[] chSet);
/*
* The int array process method GetIntArray
* @param int[] nAdd1 : add one array
* @param int[] nAdd2 : add other array
* @return(int[]) : sum array of two add array var
* @author : jernymy
* @date : 20110508
* */
public native int[] GetIntArray(int[] nAdd1, int[] nAdd2);
/*
* The int array process method SetIntArray
* @param int[] nSet : set one int array data
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetIntArray(int[] nSet);
/*
* The String array process method GetStrArray
* @return(String[]) : String array with null parameter
* @author : jernymy
* @date : 20110508
* */
public native String[] GetStrArray();
/*
* The String array process method PrcsStrArray
* @param String sSet : the string with " " token sSet
* @return(String[]) : ervey string by " " token
* @author : jernymy
* @date : 20110508
* */
public native String[] PrcsStrArray(String sSet);
/*
* The String array process method SetStrArray
* @param String[] sSet : set the string array
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetStrArray(String[] sSet);
/*-------- jernymy for array type declaration end --------*/
/*-------- jernymy for class(struct) type declaration start --------*/
/*
* The jernymyjni class(struct) process method GetClass
* @param int nIdx : get class data by index
* @return(jernymyjni) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native jernymyjni GetClass(int nIdx);
/*
* The jernymyjni class(struct) process method SetClass
* @param jernymyjni cClass : set class data by class index
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetClass(jernymyjni cClass);
/*-------- jernymy for class(struct) type declaration end --------*/
/*-------- jernymy for class(struct) array type declaration start --------*/
/*
* The jernymyjni class(struct) array process method GetClassArray
* @return(jernymyjni[]) : class array data
* @author : jernymy
* @date : 20110508
* */
public native jernymyjni[] GetClassArray();
/*
* The jernymyjni class(struct) array process method SetClassArray
* @param jernymyjni[] cNcomnAry : set class array data
* @return(int) : status, 0-OK, other-Error
* @author : jernymy
* @date : 20110508
* */
public native int SetClassArray(jernymyjni[] acClassAry);
/*-------- jernymy for class(struct) array type declaration end --------*/
static
{
System.loadLibrary("jernymyjni"); // jernymy here is the so name
}
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStrArray
(JNIEnv *jpcEnv, jobject jcObj, jobjectArray jcObjAry)
{
int nIdx;
const char *lpcstrGet;
jobject jcObjCur;
int nLen = (*jpcEnv)->GetArrayLength(jpcEnv, jcObjAry);
JNI_ASSERT_V_RTN_VAR(nLen, 0);
printf("[C]-jcObjAry length:%d\n", nLen);
for (nIdx = 0; nIdx < nLen; nIdx++)
{
jcObjCur = (*jpcEnv)->GetObjectArrayElement(jpcEnv, jcObjAry, nIdx);
JNI_ASSERT_P_RTN_VAR(jcObjCur, 0);
lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, (jstring)jcObjCur, 0 );
JNI_ASSERT_P_RTN_VAR(lpcstrGet, 0);
printf("[C]-index[%d] lpcstrGet:%s\n", nIdx, lpcstrGet);
(*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jcObjCur, lpcstrGet);
}
printf("[C]-\n");
return 0;
}
JNIEXPORT jobject JNICALL Java_com_jni_jernymyjni_GetClass
(JNIEnv *jpcEnv, jobject jcObj, jint jnIdx)
{
char achBuf[32] = {0};
jclass jcStruct;
jfieldID jchChar;
jfieldID jnInt;
jfieldID jsString;
jstring jsStr;
jobject joCurObj;
jmethodID jmId;
jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni");
JNI_ASSERT_P_RTN_VAR(jcStruct, NULL);
jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C");
JNI_ASSERT_P_RTN_VAR(jchChar, NULL);
jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I");
JNI_ASSERT_P_RTN_VAR(jnInt, NULL);
#ifdef WIN32
jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;");
#else
jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;");
// jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "java/lang/String");
#endif
JNI_ASSERT_P_RTN_VAR(jsString, NULL);
// get class init method
jmId = (*jpcEnv)->GetMethodID(jpcEnv, jcStruct, "<init>", "()V");
JNI_ASSERT_P_RTN_VAR(jsString, NULL);
joCurObj = (*jpcEnv)->NewObject(jpcEnv, jcStruct, jmId);
JNI_ASSERT_P_RTN_VAR(joCurObj, NULL);
(*jpcEnv)->SetCharField(jpcEnv, joCurObj, jchChar, (char)(1+'d'));
(*jpcEnv)->SetIntField(jpcEnv, joCurObj, jnInt, 0);
sprintf(achBuf, "****sString[%d]%c", 0, 0);
jsStr = (*jpcEnv)->NewStringUTF(jpcEnv, achBuf);
JNI_ASSERT_P_RTN_VAR(jsStr, NULL);
(*jpcEnv)->SetObjectField(jpcEnv, joCurObj, jsString, jsStr);
printf("[C]-----%d, %c, %s\n", 0, 1+'0', achBuf);
return joCurObj;
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClass
(JNIEnv *jpcEnv, jobject jcObj, jobject jcSetStruct)
{
const char *lpcstrGet;
jchar jchData;
jint jnData;
jobject jcObjStr;
jfieldID jchChar;
jfieldID jnInt;
jfieldID jsString;
jclass jcStruct;
// here is the class name, java file create a com_jni_jernymyjni class, so name is
jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni");
JNI_ASSERT_P_RTN_VAR(jcStruct, JNI_ERR_NULL_CLASS);
// char sig is "C", see the .h file, Signature: (C)[C
jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C");
JNI_ASSERT_P_RTN_VAR(jchChar, JNI_ERR_NULL_CHAR);
// int sig is "I", see the .h file, Signature: ([I[I)[I
jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I");
JNI_ASSERT_P_RTN_VAR(jnInt, JNI_ERR_NULL_INT);
// string, see the .h file, Signature: (Ljava/lang/String;)[Ljava/lang/String;
jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;");
JNI_ASSERT_P_RTN_VAR(jsString, JNI_ERR_NULL_STR);
// get char field information
jchData = (*jpcEnv)->GetCharField(jpcEnv, jcSetStruct, jchChar);
printf("[C]-jchData:%c\n", jchData);
// get int field information
jnData = (*jpcEnv)->GetIntField(jpcEnv, jcSetStruct, jnInt);
printf("[C]-jnData:%d\n", jnData);
// get object field , now is string information
jcObjStr = (*jpcEnv)->GetObjectField(jpcEnv, jcSetStruct, jsString);
JNI_ASSERT_P_RTN_VAR(jcObjStr, JNI_ERR_NULL_FIELD_OBJ);
// get const char information from jstring
lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, (jstring)jcObjStr, 0);
JNI_ASSERT_P_RTN_VAR(lpcstrGet, JNI_ERR_NULL_STR_UTF_C);
printf("[C]-lpcstrGet:%s\n", lpcstrGet);
// release const char information from jstring
(*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jcObjStr, lpcstrGet);
printf("[C]-\n");
return 0;
}
#define STRUCT_ARRAY_NUM 3
JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetClassArray
(JNIEnv *jpcEnv, jobject jcObj)
{
int nIdx;
char achBuf[32] = {0};
jclass jcStruct;
jobjectArray jcAry;
jfieldID jnInt;
jfieldID jchChar;
jfieldID jsString;
jstring jsStr;
jobject joCurObj;
jmethodID jmId;
// here is the class name, java file create a com_jni_jernymyjni class, so name is
jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni");
JNI_ASSERT_P_RTN_VAR(jcStruct, NULL);
// how many array will create, now is 3, and init is 0;
jcAry = (*jpcEnv)->NewObjectArray(jpcEnv, STRUCT_ARRAY_NUM, jcStruct, 0);
JNI_ASSERT_P_RTN_VAR(jcAry, NULL);
// char sig is "C", see the .h file, Signature: (C)[C
jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C");
JNI_ASSERT_P_RTN_VAR(jchChar, NULL);
// int sig is "I", see the .h file, Signature: ([I[I)[I
jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I");
JNI_ASSERT_P_RTN_VAR(jnInt, NULL);
// string, see the .h file, Signature: (Ljava/lang/String;)[Ljava/lang/String;
jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;");
JNI_ASSERT_P_RTN_VAR(jsString, NULL);
// get class method, 得到类的构造函数
jmId = (*jpcEnv)->GetMethodID(jpcEnv, jcStruct, "<init>", "()V");
JNI_ASSERT_P_RTN_VAR(jmId, NULL);
for (nIdx = 0; nIdx < STRUCT_ARRAY_NUM; nIdx++)
{
// create a new object area, like malloc or alloc buffer
joCurObj = (*jpcEnv)->NewObject(jpcEnv, jcStruct, jmId);
JNI_ASSERT_P_RTN_VAR(joCurObj, NULL);
// set the char value
(*jpcEnv)->SetCharField(jpcEnv, joCurObj, jchChar, (char)(nIdx+'a'));
// set the int value
(*jpcEnv)->SetIntField(jpcEnv, joCurObj, jnInt, nIdx);
sprintf(achBuf, "****sString[%d]%c", nIdx, 0);
// get jstring with achBuf
jsStr = (*jpcEnv)->NewStringUTF(jpcEnv, achBuf);
JNI_ASSERT_P_RTN_VAR(jsStr, NULL);
// set the string value
(*jpcEnv)->SetObjectField(jpcEnv, joCurObj, jsString, jsStr);
printf("[C]-Line:%d-Java_com_jni_jernymyjni_GetClassArray\n", __LINE__);
printf("[C]-----%d, %c, %s\n", nIdx, 'd', achBuf);
// set all struct value with index
(*jpcEnv)->SetObjectArrayElement(jpcEnv, jcAry, nIdx, joCurObj);
}
return jcAry;
}
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClassArray
(JNIEnv *jpcEnv, jobject jcObj, jobjectArray jcObjAry)
{
int nIdx;
const char *lpcstrGet;
jobject jcObjCur;
jchar jchData;
jint jnData;
jobject jcObjStr;
jfieldID jchChar;
jfieldID jnInt;
jfieldID jsString;
jclass jcStruct;
int nLen = (*jpcEnv)->GetArrayLength(jpcEnv, jcObjAry);
// here is the class name, java file create a com_jni_jernymyjni class, so name is
jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni");
JNI_ASSERT_P_RTN_VAR(jcStruct, JNI_ERR_NULL_CLASS);
// char sig is "C", see the .h file, Signature: (C)[C
jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C");
// int sig is "I", see the .h file, Signature: ([I[I)[I
jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I");
JNI_ASSERT_P_RTN_VAR(jnInt, JNI_ERR_NULL_INT);
// string, see the .h file, Signature: (Ljava/lang/String;)[Ljava/lang/String;
jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;");
JNI_ASSERT_P_RTN_VAR(jsString, JNI_ERR_NULL_STR);
printf("[C]-jcObjAry length:%d\n", nLen);
for (nIdx = 0; nIdx < nLen; nIdx++)
{
printf("[C]-index[%d]", nIdx);
// get every object information
jcObjCur = (*jpcEnv)->GetObjectArrayElement(jpcEnv, jcObjAry, nIdx);
JNI_ASSERT_P_RTN_VAR(jcObjStr, JNI_ERR_NULL_OBJ_ARY_ELEMENT);
// get char field information
jchData = (*jpcEnv)->GetCharField(jpcEnv, jcObjCur, jchChar);
// JNI_ASSERT_V_RTN_VAR(jchData, JNI_ERR_NULL_FIELD_CHAR);
printf("[C]-jchData:%c\n", jchData);
// get int field information
jnData = (*jpcEnv)->GetIntField(jpcEnv, jcObjCur, jnInt);
printf("[C]-jnData:%d\n", jnData);
// get object field , now is string information
jcObjStr = (*jpcEnv)->GetObjectField(jpcEnv, jcObjCur, jsString);
JNI_ASSERT_P_RTN_VAR(jcObjStr, JNI_ERR_NULL_FIELD_OBJ);
// get const char information from jstring
lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, (jstring)jcObjStr, 0);
JNI_ASSERT_P_RTN_VAR(lpcstrGet, JNI_ERR_NULL_STR_UTF_C);
printf("[C]-lpcstrGet:%s\n", lpcstrGet);
// release const char information from jstring
(*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jcObjStr, lpcstrGet);
}
printf("[C]-\n");
return 0;
}
#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;
}
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jni_jernymyjni */
#ifndef _Included_com_jni_jernymyjni
#define _Included_com_jni_jernymyjni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_jni_jernymyjni
* Method: GetChar
* Signature: (C)C
*/
JNIEXPORT jchar JNICALL Java_com_jni_jernymyjni_GetChar
(JNIEnv *, jobject, jchar);
/*
* Class: com_jni_jernymyjni
* Method: SetChar
* Signature: (C)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetChar
(JNIEnv *, jobject, jchar);
/*
* Class: com_jni_jernymyjni
* Method: GetInt
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_GetInt
(JNIEnv *, jobject, jint, jint);
/*
* Class: com_jni_jernymyjni
* Method: SetInt
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetInt
(JNIEnv *, jobject, jint);
/*
* Class: com_jni_jernymyjni
* Method: GetStr
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_GetStr
(JNIEnv *, jobject);
/*
* Class: com_jni_jernymyjni
* Method: PrcsStr
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_PrcsStr
(JNIEnv *, jobject, jstring);
/*
* Class: com_jni_jernymyjni
* Method: SetStr
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStr
(JNIEnv *, jobject, jstring);
/*
* Class: com_jni_jernymyjni
* Method: GetCharArray
* Signature: (C)[C
*/
JNIEXPORT jcharArray JNICALL Java_com_jni_jernymyjni_GetCharArray
(JNIEnv *, jobject, jchar);
/*
* Class: com_jni_jernymyjni
* Method: SetCharArray
* Signature: ([C)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetCharArray
(JNIEnv *, jobject, jcharArray);
/*
* Class: com_jni_jernymyjni
* Method: GetIntArray
* Signature: ([I[I)[I
*/
JNIEXPORT jintArray JNICALL Java_com_jni_jernymyjni_GetIntArray
(JNIEnv *, jobject, jintArray, jintArray);
/*
* Class: com_jni_jernymyjni
* Method: SetIntArray
* Signature: ([I)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetIntArray
(JNIEnv *, jobject, jintArray);
/*
* Class: com_jni_jernymyjni
* Method: GetStrArray
* Signature: ()[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetStrArray
(JNIEnv *, jobject);
/*
* Class: com_jni_jernymyjni
* Method: PrcsStrArray
* Signature: (Ljava/lang/String;)[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_PrcsStrArray
(JNIEnv *, jobject, jstring);
/*
* Class: com_jni_jernymyjni
* Method: SetStrArray
* Signature: ([Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStrArray
(JNIEnv *, jobject, jobjectArray);
/*
* Class: com_jni_jernymyjni
* Method: GetClass
* Signature: (I)Lcom/jni/jernymyjni;
*/
JNIEXPORT jobject JNICALL Java_com_jni_jernymyjni_GetClass
(JNIEnv *, jobject, jint);
/*
* Class: com_jni_jernymyjni
* Method: SetClass
* Signature: (Lcom/jni/jernymyjni;)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClass
(JNIEnv *, jobject, jobject);
/*
* Class: com_jni_jernymyjni
* Method: GetClassArray
* Signature: ()[Lcom/jni/jernymyjni;
*/
JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetClassArray
(JNIEnv *, jobject);
/*
* Class: com_jni_jernymyjni
* Method: SetClassArray
* Signature: ([Lcom/jni/jernymyjni;)I
*/
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClassArray
(JNIEnv *, jobject, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
# Android.mk by jernymy, 20110508
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jernymyjni
LOCAL_SRC_FILES := com_jni_jernymyjni.c
include $(BUILD_SHARED_LIBRARY)
package com.jni;
import android.app.Activity;
import android.os.Bundle;
public class AndroidJni extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println("hello");
jernymyjni cJni = new jernymyjni();
System.out.println("--------jernymy test jernymyjni start--------");
System.out.println("--------display base type test");
System.out.println("--------GetChar('A')--------");
char chTmp = cJni.GetChar('A');
System.out.println(String.valueOf(chTmp));
System.out.println("***************************");
System.out.println("--------SetChar('A')--------");
int nRtn = cJni.SetChar('A');
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("--------GetInt(5, 10)--------");
int nSum = cJni.GetInt(5, 10);
System.out.println(String.valueOf(nSum));
System.out.println("***************************");
System.out.println("--------SetInt(10)--------");
nRtn = cJni.SetInt(10);
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("--------GetStr(\"Jernymy Jni GetStr\")--------");
String sStr = cJni.GetStr();
System.out.println(sStr);
System.out.println("***************************");
System.out.println("--------GetStr(\"Jernymy Jni PrcsStr\")--------");
sStr = cJni.PrcsStr("Jernymy Jni TestAAA");
System.out.println(sStr);
System.out.println("***************************");
System.out.println("--------SetStr(\"Jernymy Jni SetStr\")--------");
nRtn = cJni.SetStr("Java Jni Set");
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("------------------------------------------------");
System.out.println("--------display array test");
System.out.println("--------GetCharArray('A')--------");
char[] chAry = cJni.GetCharArray('A');
int nIdx;
System.out.println("chAry.length:" + String.valueOf(chAry.length));
for (nIdx = 0; nIdx < chAry.length; nIdx++)
{
System.out.println(String.valueOf(chAry[nIdx])+" ");
}
System.out.println("***************************");
System.out.println("--------SetCharArray('A')--------");
nRtn = cJni.SetCharArray(chAry);
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("--------GetIntArray({1, 2, 3}, {4, 5, 6})--------");
int[] nAddAry1 = {1, 2, 3};
int[] nAddAry2 = {4, 5, 6};
int[] nSumAry = cJni.GetIntArray(nAddAry1, nAddAry2);
System.out.println("nSumAry.length:" + String.valueOf(nSumAry.length));
for (nIdx = 0; nIdx < nSumAry.length; nIdx++)
{
System.out.println(String.valueOf(nSumAry[nIdx])+" ");
}
System.out.println("***************************");
System.out.println("--------SetIntArray({1, 2, 3}--------");
nRtn = cJni.SetIntArray(nAddAry1);
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("--------GetStrArray(" +
"\"Jernymy Java Jni GetStrArray\")--------");
String[] sStrAry = cJni.GetStrArray();
System.out.println("sStrAry.length:" + String.valueOf(sStrAry.length));
for (nIdx = 0; nIdx < sStrAry.length; nIdx++)
{
System.out.println(sStrAry[nIdx]+" ");
}
System.out.println("***************************");
System.out.println("--------PrcsStrArray(" +
"\"Jernymy Java Jni PrcsStrArray\")--------");
sStrAry = cJni.PrcsStrArray("Jernymy Android JniTest");
System.out.println("sStrAry.length:" + String.valueOf(sStrAry.length));
for (nIdx = 0; nIdx < sStrAry.length; nIdx++)
{
System.out.println(sStrAry[nIdx]+" ");
}
System.out.println("***************************");
System.out.println("--------SetStrArray({\"Jernymy\"," +
" \"Java\", \"Jni\", \"SetStrArray\"})--------");
String[] sStrSetAry = {"Jernymy", "Java", "Jni", "SetStrArray"};
nRtn = cJni.SetStrArray(sStrSetAry);
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("-------------------------------------------------");
System.out.println("--------display class test");
System.out.println("--------GetClass(0)--------");
jernymyjni cComn = cJni.GetClass(0);
if (null == cComn)
{
System.out.println("cComn is null");
}
else
{
System.out.println(
"chChar:" + String.valueOf(cComn.chChar)
+" nPuId:" + String.valueOf(cComn.nInt)
+" sName:" + cComn.sString);
}
System.out.println("***************************");
System.out.println("--------SetClass({'N', 508, \"Native\"})--------");
jernymyjni cComnSet = new jernymyjni();
cComnSet.chChar = 'N';
cComnSet.nInt = 508;
cComnSet.sString = "Native";
nRtn = cJni.SetClass(cComnSet);
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("--------GetClassArray()--------");
jernymyjni[] sStructAry = cJni.GetClassArray();
System.out.println("sStructAry:" + String.valueOf(sStructAry.length));
for (nIdx = 0; nIdx < sStructAry.length; nIdx++)
{
System.out.println("----index[" + String.valueOf(nIdx) + "]----");
if (null == sStructAry[nIdx])
{
System.out.println("sStructAry is null");
}
else
{
System.out.println(""
+" chChar: " + String.valueOf(sStructAry[nIdx].chChar)
+", nInt: " + String.valueOf(sStructAry[nIdx].nInt)
+", sName: " + sStructAry[nIdx].sString);
}
}
System.out.println("***************************");
System.out.println("--------SetClassArray(Ncomn[])--------");
System.out.println("sStructAry:" + String.valueOf(sStructAry.length));
for (nIdx = 0; nIdx < sStructAry.length; nIdx++)
{
System.out.println("index[" + String.valueOf(nIdx)
+"] chChar:" + String.valueOf(sStructAry[nIdx].chChar)
+" nInt:" + String.valueOf(sStructAry[nIdx].nInt)
+" sString:" + sStructAry[nIdx].sString);
}
nRtn = cJni.SetClassArray(sStructAry);
System.out.println("nRtn:" + String.valueOf(nRtn));
System.out.println("***************************");
System.out.println("--------Jernymy test jernymyjni end --------");
}
}