AndroidStudio中jni的使用

1.新建一个Jni调用类

public class MyJni {

    static {
        System.loadLibrary("MyJni");
//        System.load("/data/user/0/com.example.myapplication/app_libs/libMyJni.so");
//        System.load("/storage/emulated/0/Android/data/com.example.myapplication/download/libMyJni.so");
//        javah -jni -classpath E:\cdz\MyApplication2\app\build\intermediates\javac\debug\classes com.example.myapplication.MyJni
    }

    public native static String getString();



}

2.点击build-->make project

完成后会在app\build\intermediates\javac\debug\classes\com.example.myapplication\目录下生成一个MyJni.class文件

AndroidStudio中jni的使用

3.在main目录下新建一个jni文件夹

AndroidStudio中jni的使用

4.打开terminal:cd到jni目录下运行:

javah -jni -classpath E:\cdz\MyApplication2\app\build\intermediates\javac\debug\classes com.example.myapplication.MyJni

会在jni目录下生成一个com_example_myapplication_MyJni.h文件

AndroidStudio中jni的使用

5.新建一个test1.c文件

#include "jni.h"
#include "com_example_myapplication_MyJni.h"
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>


JNIEXPORT jstring JNICALL Java_com_example_myapplication_MyJni_getString
  (JNIEnv *env, jclass jz){


       /*手动加载指定位置的so动态库*/
        void* handle = dlopen("/data/user/0/com.example.myapplication/app_libs/libMyAdd.so", RTLD_LAZY);


        if (handle)
        {
                      int (*add)(int a, int b);

                        /*根据动态链接库操作句柄与符号,返回符号对应的地址*/
                        add = dlsym(handle, "add");

                        int sum = add(7, 8);
                        printf("7+8 = %d\n", sum);

                        dlclose(handle);
                        return (*env)->NewStringUTF(env,"jni---->so---->so result=");
        }else{
                return (*env)->NewStringUTF(env, "open failed!");
        }




  }

6.新建一个Android.mk文件

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

LOCAL_MODULE := MyJni
LOCAL_SRC_FILES := test1.c
include $(BUILD_SHARED_LIBRARY)

7.新建一个Application.mk文件

APP_CPPFLAGS += -fpermissive #兼容老的语法,使一些错误降为警告
APP_ABI := all

8.打开terminal cd到jni目录下 运行ndk-build命令生成libMyJni.so库

AndroidStudio中jni的使用

9.新建一个test2.c文件文件 

int add( int x, int y)
{
     return x + y;
}

10.修改Android.mk文件

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

LOCAL_MODULE := MyAdd 
LOCAL_SRC_FILES := test2.c
include $(BUILD_SHARED_LIBRARY)

11.打开terminal cd到jni目录下 运行ndk-build命令生成libMyAdd.so库

AndroidStudio中jni的使用