您的位置:首页 > 移动开发 > Android开发

Android jni初探

2016-03-09 17:21 459 查看
因为我们是系统开发,所以所需要调用的jni可以直接在系统下编译,我就直接写jni文件,首先我需要一个.h文件,主要是jni的参数,参考java参数转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就不重复了,直接加载调用就可以了。中间遇到一些别的问题,我忘记了,反正第一次学习还是很困难的。不同的需求可能遇到不同的问题,多去网上寻求信息。多交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android jni调用