1、方法的调用
假设java有这么一个方法
private static native void openFile();
那么生成相应的jni方法为
void Java_com_churnlabs_ffmpegsample_MainActivity_openFile(JNIEnv * env, jobject this)
问题1:什么是JNIEnv
找到android-ndk-r7b\platforms\android-8\arch-arm\usr\include下的jni.h文件
找到JNIEnv 是一个typedef const struct JNINativeInterface* JNIEnv;; 的结构体,接下来调用JNIEnv里面的方法
jstring (*NewStringUTF)(JNIEnv*, const char*);
调用上面的方法:
return (*(* env)).NewStringUTF(env,"hello world result");
一般大家不用上面这种方式,而是 (*env)-> NewStringUTF -> 表示 先获取到 *env 里面的内容(即*(xxx)) 让后点里面的方法。
2.c中的string 相连
//在c语言中 是没有java的String
char* cstr = Jstring2CStr(env, jstr);
LOGD("cstr=%s",cstr);
// c语言中的字符串 都是以'/0' 作为结尾
char arr[7]= {' ','h','e','l','l','o','\0'};
strcat(cstr,arr);
LOGD("new cstr=%s",cstr);
return (*env)->NewStringUTF(env,cstr);
3、java传int 数组给c
JNIEXPORT jintArray JNICALL Java_cn_itcast_ndk3_DataProvider_intMethod
(JNIEnv * env , jobject obj , jintArray arr){
//1.知道数组的长度
//2.操作这个数组里面的每一个元素
int len = (*env)->GetArrayLength(env,arr);
LOGD("shuzu len =%d",len);
jint* intarr = (*env)->GetIntArrayElements(env,arr,1);
int i =0; //c99
for(;i<len;i++){
//*(intarr+i) += 10;
intarr[i]+= 10;
}
return arr;
(*env)->ReleaseIntArrayElements(env,arr,intarr,0); // c语言释放掉 刚才申请的内存空间
4、char 对应c中的string
5、静态方法的调用
public static native int sub(int x ,int y);
JNIEXPORT jint JNICALL Java_cn_itcast_ndk3_DataProvider_sub
(JNIEnv * env, jclass clazz, jint x, jint y){
。。。。
}
总结:
*env java 虚拟机 结构体c实现的指针 包含的有很多jni方法
jobject obj 代表的是调用这个c代码的java对象。
4、