JNI使用详解

JNI基本使用步骤

1.java定义本地方法native,通常情况下应单独定一个类存放所有native方法。
2.项目的根目录下添加jni目录。
3.把光标移到本地native方法,通过NDK工具生成【包名+native类名.h】文件。
4.在jni目录下编写android.mk文件,声明并在jni目录下添加需要引用的.so和.c或.cpp文件。注意编写的.c或.cpp文件中的方法名需要同NDK生成的.h文件中的方法名一致。
5.在创建application.mk文件,作用是声明所有支持的平台。
6.把光标移到本地native方法,通过NDK工具编译生成.so文件(.so经编译后生成在libs文件夹下)
7.使用本地native方法前需要先动态加载库System.loadLibrary("XXX")。

1.定义native方法
public class TestApi {
    private TestApi(){
        
    }
    private static TestApi testApi = new TestApi();
    public static TestApi getTestApi(){
        return testApi;
    }
        public static  native int getTest();

}
2.创建jni目录

可以手动创建jni目录以及目录下的文件,也可以右键项目,android Tools—>Add Native Support 自动生成。

3.NDK自动生成【包名+native类名.h】文件
#include 

#ifndef _Included_com_hsr_hspad_vision_net_VisionApi
#define _Included_com_hsr_hspad_vision_net_VisionApi
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_com_example_pkgtestmain_TestApi_getTest
  (JNIEnv *, jclass);
4.在jni目录下编写android.mk文件
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := testsdkapi   //声明的名字
LOCAL_SRC_FILES := libtestsdk.so  //引用的.so名字

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE    := TestPkg   //在libs文件夹下会生成对应的libTestPkg.so
LOCAL_SRC_FILES := TestPkg.cpp //cpp文件名
LOCAL_SHARED_LIBRARIES += testsdkapi   //与上面声明的名字一样
LOCAL_LDLIBS = -llog

include $(BUILD_SHARED_LIBRARY)
5.编写application.mk文件
ARM_ABI := armeabi //支持armeabi平台
6.动态加载.so库
public class MainpkgActivity extends FragmentActivity {
    static {
        try {
            System.loadLibrary("testapi"); //libs文件夹下的.so库去掉前缀lib和后缀.so,大小写有区别
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mainpkg);
                //调用本地native方法
                TestApi.getTestApi().getTest();
        }

}

注意以上代码只代表通用的使用方法,各步骤代码没有关联性,不能实际运行。

你可能感兴趣的:(JNI使用详解)