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;
}
{"_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++ 的接口了。
(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;
}
// 这里有对于类型、函数转换的规则,百度上很容易找到。
{"_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++ 的接口了。