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文件
3.在main目录下新建一个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文件
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库
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库