Android jni初探
2016-03-09 17:21
459 查看
因为我们是系统开发,所以所需要调用的jni可以直接在系统下编译,我就直接写jni文件,首先我需要一个.h文件,主要是jni的参数,参考java参数转jni参数的使用方法。
如果你觉得jni的文件难写,可以只用jni写一些接口主要的工作还是用c/c++去实现,这样你就不用纠结不会jni了。下面是jni对应的.c文件
其中的add(b,x,y)就是用纯c/c++实现的,参数参考jni参数转c/c++语言,网上很多,就不另行说明了。另外(*env)->ReleaseByteArrayElements(env,data,data1,0);//这句话在有数组传下来的时候,用完要加上,不然可能会产生oom,对于不经常使用c/c++编程的小伙伴,要注意,对象引用和释放。
接下来,就是c/c++的文件了,*.h
*.c
看就是这么简单,接下来就要放到系统中编译了,Android编译so库文件,需要编写mk文件,mk文件也很简单,一般直接抄系统里的,再改改,规则网上都有不过有时候还是要多测测。
在说下如果想在jni中debug信息的话,就要把需要liblog库,可以把liblog库加入,__android_log_print可以打印一些想要调试的信息。好了,差不多了,Android调用jni就不重复了,直接加载调用就可以了。中间遇到一些别的问题,我忘记了,反正第一次学习还是很困难的。不同的需求可能遇到不同的问题,多去网上寻求信息。多交流。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_ura_test_JNITest */ #ifdef __cplusplus extern "C" { #endif /* 11. * Class: com_ura_test_JNITest 12. * Method: GetTest 13. * Signature: ()Ljava/lang/String; 14. */ JNIEXPORT jint JNICALL Java_com_chenww_camera_ui_CameraActivity_GetTest (JNIEnv *, jobject, jintArray, jint, jint); #ifdef __cplusplus } #end
如果你觉得jni的文件难写,可以只用jni写一些接口主要的工作还是用c/c++去实现,这样你就不用纠结不会jni了。下面是jni对应的.c文件
#include "com_zhiying_autofocus.h" #include "operate.h" JNIEXPORT jint JNICALL Java_com_chenww_camera_ui_CameraActivity_GetTest (JNIEnv *env, jobject obj, jintArray a, jint x, jint y) { jint *b = (*env)->GetIntArrayElements(env,a,NULL); jint m = add(b,x, y); (*env)->ReleaseByteArrayElements(env,data,data1,0);//这里不加会内存溢出 return m; }
其中的add(b,x,y)就是用纯c/c++实现的,参数参考jni参数转c/c++语言,网上很多,就不另行说明了。另外(*env)->ReleaseByteArrayElements(env,data,data1,0);//这句话在有数组传下来的时候,用完要加上,不然可能会产生oom,对于不经常使用c/c++编程的小伙伴,要注意,对象引用和释放。
接下来,就是c/c++的文件了,*.h
#include <string.h> #include <jni.h> #include <stdio.h> #include <android/log.h> #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "AutoFocus", __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "AutoFocus", __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "AutoFocus", __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "AutoFocus", __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "AutoFocus", __VA_ARGS__) typedef unsigned char BYTE; int add(int *a, int x, int y);
*.c
#include "operate.h" #include <math.h> #include <unistd.h> int b = 0; int add(int *a, int x, int y) { b += a[x]+a[y]; LOGI("aaaa"); LOGD("BBBB"); LOGE("CCCC=%d",b); return b; }
看就是这么简单,接下来就要放到系统中编译了,Android编译so库文件,需要编写mk文件,mk文件也很简单,一般直接抄系统里的,再改改,规则网上都有不过有时候还是要多测测。
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ com_zhiying_autofocus.c operate.c LOCAL_SHARED_LIBRARIES := liblog LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) LOCAL_MODULE := libTestJNI include $(BUILD_SHARED_LIBRARY)
在说下如果想在jni中debug信息的话,就要把需要liblog库,可以把liblog库加入,__android_log_print可以打印一些想要调试的信息。好了,差不多了,Android调用jni就不重复了,直接加载调用就可以了。中间遇到一些别的问题,我忘记了,反正第一次学习还是很困难的。不同的需求可能遇到不同的问题,多去网上寻求信息。多交流。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories