浅谈JNI 调用

1、功能:
 (1)JNI 功能在java文件中定义函数,在JNI 中实现该函数,从而实现了,java到c++ 空间函数的调用。
2、实现:
 (1)JAVA文件CodeConvertTest.java,code_convert_jni 为jni 文件生成的动态库,名字为libcode_convert_jni.so;
    package widget.common;
    public class CodeConvertTest {
    static final int CODE_TYPE_ISO8859_5 = 0;
    static final int CODE_TYPE_ISO8859_1 = 1;
    static final int CODE_TYPE_ASCII = 2;
    static final int CODE_TYPE_UTF_16BE = 3;
    static final int CODE_CONVER_UTF_8 = 4;
    static final int CODE_CONVER_MS_JIS_KANJI = 5;
    static final int CODE_CONVER_SHIFT_JIS = 6;
    static final int CODE_CONVER_UCS_2 = 7;
    /* 系统动态加载JNI 库 */
    static
    {
        System.loadLibrary("code_convert_jni");
    }
    
    public int getIndex()
    {
        return _getIndex();
    }
    private native final int _getIndex();

    }

 (2)JNI 层文件:widget_common_CodeConvertTest.cpp
    #include "codeConver.h"
    #include "utils/Log.h"
    #include <stdio.h>
    #include <assert.h>
    #include <limits.h>
    #include <unistd.h>
    #include <string.h>
    #include <fcntl.h>
    #include <utils/threads.h>
    #include "jni.h"
    #include "JNIHelp.h"
    #include "android_runtime/AndroidRuntime.h"
    #include "utils/Errors.h"
    #include "utils/KeyedVector.h"
    #include "utils/String8.h"
    #include <binder/Parcel.h>
    #include <binder/IPCThreadState.h>
    #include <binder/IServiceManager.h>
    #include "codeConver.h"
    using namespace android;

    static const char* const kClassPathName =  "widget/common/CodeConvertTest";
    static CodeConver conver;
    const int PS_NAME_DST_LEN = 800;
    const int PS_NAME_SRC_LEN = 256;
    static char psNameSrc[PS_NAME_SRC_LEN]={0};
    static char psNameDst[PS_NAME_DST_LEN]={0};
    const int CODE_TYPE_ISO8859_5 = 0;
    const int CODE_TYPE_ISO8859_1 = 1;
    const int CODE_TYPE_ASCII = 2;
    const int CODE_TYPE_UTF_16BE = 3;
    const int CODE_TYPE_UTF_8 = 4;
    const int CODE_TYPE_MS_JIS_KANJI = 5;
    const int CODE_TYPE_SHIFT_JIS = 6;
    const int CODE_TYPE_UCS_2 = 7;
    const int CODE_TYPE_EW = 8;

    static jint android_jnigetIndex(JNIEnv* env, jobject thiz)
    {
        // 在这里可以添加调用C C++ 的接口

        return 1;
    }


   // 这里有对于类型、函数转换的规则,百度上很容易找到。

    static JNINativeMethod gMethods[] = {
        {"_getIndex",                    "()I",            (void*)android_jnigetIndex},
    
    };

    jint JNI_OnLoad(JavaVM* vm, void* reserved)
    {
        JNIEnv* env = NULL;
        jint result = -1;

        if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        LOGE("ERROR: GetEnv failed\n");
        return result;
        }
        assert(env != NULL);

        if (AndroidRuntime::registerNativeMethods(env,kClassPathName, gMethods, NELEM(gMethods)) < 0) {
        LOGE("ERROR: MediaPlayer native registration failed\n");
        return result;
        }

        /* success -- return valid version number */
        result = JNI_VERSION_1_4;
        return result;

    }
 (3) Android.mk 文件
    LOCAL_PATH:= $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_SRC_FILES:= \
        widget_common_CodeConvertTest.cpp

    LOCAL_C_INCLUDES := \
        $(shell find system/extend/sysd/PCommonLib -type d -name 'publicinc') \
        $(shell find system/extend/sysd/PSystemService -type d -name 'publicinc') \
        $(shell find system/extend/sysd/PSocketLib -type d -name 'publicinc') \
        $(shell find system/extend/sysd/Handler -type d -name 'publicinc') \
        system/extend/sysd/PCommonLib/NSystemInfoLib/src \
        system/extend/sysd/PCommonLib/NStandardLib/src \
        system/extend/utils/libcodeConver \
        system/extend/sysd/sysdIFLib/include \
        external/icu4c/common

    LOCAL_MODULE:= libcode_convert_jni
    LOCAL_MODULE_TAGS := optional

    LOCAL_SHARED_LIBRARIES := \
        libcutils libutils libbinder libicuuc libexpat \
        libdl libPCommonLib liblog libandroid_runtime libnativehelper libCodeConver

    include $(BUILD_SHARED_LIBRARY)

3、总结通过以上步骤就可以在java 中调用C++ 的接口了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值