JNI - 传统开发模式

95 阅读1分钟

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类开发方式

  1. 编写Java类、添加静态方法
  2. Make Project 并在build/intermediates/javac下找到相关类并执行javah 生成 .h 头文件
  3. src/main 下创建 jni 文件夹、复制上面 .h文件至此并创建 .c/cpp 文件
  4. 创建编写 CMake 文件 (Android.mk)
  5. local.properties添加ndk路径、build.gradle 的 defaultConfig 中添加 ndk配置, buildTypes添加 externalNativeBuild 和 sourceSets.main 配置
  6. 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' ]

 }