编写jni生成动态库的步骤

 

     JNIJava Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

    编写jni生成动态库主要有以下5个步骤

1、编写带有native声明的方法的java,如下代码

 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); 
}

2、使用javac命令编译所编写的java

如图:

-d classes是指定的生成.class文件的路径,生成的类如下图     

       编写jni生成动态库的步骤_第1张图片

3、实现JNI_OnLoad函数动态注册native方法。

   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版本号
}

4、使用C/C++实现本地方法

#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);
}

5、编写android.mk文件和application.mk文件,使用ndk_build命令生成so

      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库

   

成果物如下

  编写jni生成动态库的步骤_第2张图片

 

 

 

 

 

 

  

 

 

 

你可能感兴趣的:(jni)