张帅依的博客

积累点滴.

Android Jni编写

java文件编写

package com.example.jni

public class Testjni {
    public native int jniRead(byte[] data, int len);
    public native int jniWrite(byte[] data, int len);
    static {
        System.loadLibrary("myJni");
    }
}

jni文件编写

jni文件的函数名要和java中的方法名对应起来,在jni中申请的空间要注意释放。

#include <jni.h>
#include <android/log.h>

#define LOG_TAG "myJni.c"
#define LOGI(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA__ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA__ARGS__)

jint Java_com_example_jni_jniRead(JNIEnv *env, jobject thiz,
    jbyteArray receiveBuf, jint slen) {
    uint8_t p_recv_buf[256] = {0};
    int len = slen;
    len = read(fd, p_recv_buf, slen);
    LOGI("rea len:%d\n", len);
    (*env)->setByteArrayRegion(env, receiveBuf, 0, len,
        (const jbyte*)p_recv_buf);
    return len;
}

jint Java_com_example_jni_jniWrite(JNIEnv *env, jobject thiz,
    jbyteArray sendBuf, jint len) {
    //申请空间
    jbyte *sendelems = (*env)->GetByteArrayElements(env, sendBuf, NULL);
    ...//处理函数
    //释放
    (*env)->ReleaseByteArrayElements(env, sendBuf, sendelems, 0);
    return 0;
}

Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES:= \
    myJni.c
LOCAL_LDLIBS := -llog

LOCAL_SHARED_LIBRARIES += libam_adp liblog libcutils
LOCAL_C_INCLUDES += ../inc
#编译生成libmyJni.so
LOCAL_MODULE := libmyJni
#编译动态库
include $(BUILD_SHARED_LIBRARY)

执行mm编译。(菜鸟级别解释::=是赋值的意思,+=是追加的意思,$是引用某变量的值)补充说明:BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译,include $(BUILD_PACKAGE)则是编译出一个apk,include $(BUILD_STATIC_JAVA_LIBRARY)则是编译出jar包。

LOCAL_MODULE_TAGS说明

LOCAL_MODULE_TAGS :=user eng tests optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
我一般都使用optional

我的例子

javah生成h文件

在src目录下执行javah -jni com.example.jni.Getso后生成com_example_jni_Getso.h