声明函数
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;
}