Basic
javah -jni
根据Java类(.class) 文件生成 .h 的JNI头文件
》 javah -classpath [the path to classes] -jni packagename.classname
示例:
javah -classpath ./classes -jni com.lzp.jnidemo.NDKTools
传统JNI类开发方式
- 编写Java类、添加静态方法
- Make Project 并在build/intermediates/javac下找到相关类并执行javah 生成 .h 头文件
- src/main 下创建 jni 文件夹、复制上面 .h文件至此并创建 .c/cpp 文件
- 创建编写 CMake 文件 (Android.mk)
- local.properties添加ndk路径、build.gradle 的 defaultConfig 中添加 ndk配置, buildTypes添加 externalNativeBuild 和 sourceSets.main 配置
- Java类中加载library
示例
第一步Java类
package com.lzp.jnidemo;
public class NDKTools {
static {
System.loadLibrary( "jnidemo-jni" );
}
public static native String getStringFromNDK();
}
第三步 c文件
#include "com_lzp_jnidemo_NDKTools.h"
JNIEXPORT jstring JNICALL Java_com_lzp_jnidemo_NDKTools_getStringFromNDK(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env, "Hello friends,this is from c" );
}
第四步CMake
LOCAL_PATH := $ (call my-dir)
include $ (CLEAR_VARS)
LOCAL_MODULE := jnidemo-jni
LOCAL_SRC_FILES := jnidemo.c
include $ (BUILD_SHARED_LIBRARY)
第五步 build.gradle配置
ndk {
moduleName "jnidemo-jni"
abiFilters "arm64-v8a" , "armeabi-v7a" , "x86" , "x86_64"
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDirs = [ 'src/main/jniLibs' ]
}