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 <jni.h>
#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();
}
}
注意以上代码只代表通用的使用方法,各步骤代码没有关联性,不能实际运行。