JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。
编写jni生成动态库主要有以下5个步骤
package com.test.jni;
public class HelloNative {
static {
System.loadLibrary("HelloNative");// 加载库,前面的lib和,后缀名不用写
}
//两个native 方法
public native int nativeAdd(int var1,int var2);
public native int nativeSub(int var1,int var2);
}
-d classes是指定的生成.class文件的路径,生成的类如下图
JNI_OnLoad函数是可以用 System.loadLibrary("HelloNative");
在JNI_OnLoad函数中实现native方法的注册,如下代码
static const JNINativeMethod g_methods[] = {//存放native方法的数组
//第一个"nativeAdd是java类中native方法的名字,第二个(II)I函数签名,第三个(void*)nativeAdd是c文件中对应的函数指针
{"nativeAdd","(II)I",(void*)nativeAdd},
{"nativeSub","(II)I",(void*)nativeSub}
};
#define JNIREG_CLASS "com/test/jni/HelloNative"//指定要注册的类
void JNI_register(JNIEnv * env)//注册native接口的函数
{
jclass findClass = NULL;
findClass = (*env)->FindClass(env,JNIREG_CLASS);
if ((*env)->RegisterNatives(env,findClass, g_methods, 2) < 0)
{
//error infos
}
(*env)->DeleteLocalRef(env,findClass);
}
//JNI_OnLoad函数中,调用注册nativ接口的函数
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return -1;
}
JNI_register(env); //调用注册nativ接口的函数
return JNI_VERSION_1_4;//返回JNI版本号
}
#include
#include
#include
static jint nativeAdd(JNIEnv * env, jclass thiz,jint var1,jint var2){
return (jint)(var1+var2);
}
static jint nativeSub(JNIEnv * env, jclass thiz,jint var1,jint var2){
return (jint)(var1-var2);
}
application.mk内容如下
APP_CPPFLAGS+=-DANDROID -fexceptions -frtti
APP_STL+=stlport_static #所依赖的c标准库
APP_MODULES:=HelloNative #要生成的so库的名字,不包括lib前缀和后缀
APP_ABI:=armeabi #编译与调试的CPU架构
APP_PLATFORM:=android-9 #android版本号
android.mk内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS :=-llog
LOCAL_MODULE := HelloNative #生产模块名称
LOCAL_SRC_FILES := TestJni.c#c源文件名字
include $(BUILD_SHARED_LIBRARY)
有了这两个文件后,才可以成功调用ndk-build命令编译so库
成果物如下