聲明函數
public class DataProvider {
/**
* 計算x和y的加法 apktools
* 315
* @param x
* @param y
* @return
*/
public native int add(int x ,int y);
/**
* 給字符串後面拼裝字符 加密運算 web url
* @param s
* @return
*/
public native String sayHelloInC(String s);
/**
* 給c代碼傳遞int數組 讓c代碼給這個數組進行操作
* 圖形 聲音的處理
* @param iNum
* @return
*/
public native int[] intMethod(int[] iNum);
}
c語言實現
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"GB2312");
jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //"\0"
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
(*env)->ReleaseByteArrayElements(env,barr,ba,0); //
return rtn;
}
JNIEXPORT jint JNICALL Java_com_example_ndkpassdata_DataProvider_add
(JNIEnv * env, jobject jobject, jint x, jint y){
// 想在logcat控制檯上 打印日誌
LOGD("x=%d",x);
LOGI("y=%d",y);
// log.i(TAG,"sss");
return x+y;
}
JNIEXPORT jstring JNICALL Java_com_example_ndkpassdata_DataProvider_sayHelloInC
(JNIEnv * env, jobject jobject, jstring str){
char* c="hello";
// 在C語言中不能直接操作java中的字符串
// 把java中的字符串轉換成c語言中 char數組
char* cstr=Jstring2CStr(env,str);
strcat(cstr,c);
LOGD("%s",cstr);
return (*env)->NewStringUTF(env,cstr);
}
JNIEXPORT jintArray JNICALL Java_com_example_ndkpassdata_DataProvider_intMethod
(JNIEnv * env, jobject jobject, jintArray jarray){
// jArray 遍歷數組 jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
// 數組的長度 jsize (*GetArrayLength)(JNIEnv*, jarray);
// 對數組中每個元素 +5
int length=(*env)->GetArrayLength(env,jarray);
int* array=(*env)->GetIntArrayElements(env,jarray,0);
int i=0;
for(;i<length;i++){
*(array+i)+=5;
}
return jarray;
}