美文网首页android ndk学习
Jni第一个案例简化版

Jni第一个案例简化版

作者: 大旺旺的弟弟小旺旺 | 来源:发表于2021-10-20 22:21 被阅读0次

实现目标:

  • 在android项目基础上创建出一个jni,不使用工具
  • 一个最简单的例子
  • 输出一句话,并且写清楚注释

创建

1.创建一个android项目

2.添加JNI支持

  • 首先在Android下的build添加
//编译出来的平台
ndk {
    abiFilters "arm64-v8a", "armeabi-v7a"
        //abiFilters "armeabi-v7a"
}
  • 添加配置文件地址
externalNativeBuild {
    cmake {
        path "src/main/cpp/CMakeLists.txt"
    }
}
  • CMAKE文件
#指明cmake的版本
cmake_minimum_required(VERSION 3.4.1)

add_library(
#        最总生成的so的名字
#        SHARED   STATIC:  动态  静态库
        hello-jni
        SHARED
        hello-jni.cpp)

# Include libraries needed for hello-jni lib
# 编译链接  链接那些东西
target_link_libraries(hello-jni
                      android
                      log)

3.java代码

static {
    System.loadLibrary("hello-jni");
}   
native String showString();

4.jni代码

//extern “C”扩展c,使用我们这个创建的是cpp,所以是c++,c++如果有c的相关操作就需要
/**
 *JNICALL:是一个栈,它用来存储函数参数的, 在Android中没有实现
 */

/**JNIEXPORT :Windows 中如果需要生成动态库 , 并且需要将该动态库交给其它项目使用 ,
需要在方法前加入特殊标识 , 才能 在外部 程序代码中 调用该 DLL 动态库中定义的方法 ;
 在不同平台的实现是不同的
 */
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_demo_MainActivity_showString(JNIEnv *env, jobject thiz) {
//    输出一句话
    char *str = "i am a pet!";
//    不可以直接返回str,需要转换为jstring
    return env->NewStringUTF(str);
}

5,运行

image.png

参数说明

  • 看一下JNIEnv
    它是一个结构体
typedef _JNIEnv JNIEnv;
struct _JNIEnv; 

struct _JNIEnv {
    /* do not rename this; it does not seem to be entirely opaque */
    const struct JNINativeInterface* functions;
#if defined(__cplusplus)
    jint GetVersion()
    和一些方法
   
  • jobject
typedef _jobject*       jobject;

相关文章

网友评论

    本文标题:Jni第一个案例简化版

    本文链接:https://www.haomeiwen.com/subject/kkuxaltx.html