最近公司在做jni方面的东西,自己做了小demo在创建新project的时候直接勾选include C++ support,然后项目就会自动在MainActivity中添加
static {    System.loadLibrary("native-lib");}
   
public native String stringFromJNI();

        同时也会自动创建jni的文件,如果在其他地方想使用jni的话直接照猫画虎复制粘贴再改改就OK了,非常方便。

        就在我美滋滋的得意自己的成果时,同组的小伙伴又跟我说 要我把我的内容放到主应用里使用,可主应用并没有使用jni,那就需要单独加咯。

        于是信心满满的去百度android studio 添加jni方法,然鹅,百度到的方法都不能得到so文件,自然也无法正确的调用jni了,这个问题整整困扰了两天,我曾一度怀疑是不是本地环境的问题,甚至还把ndk版本升级到最新 还是没什么卵用。这些博客可能都不是自己的原创,从别人那里copy一份直接放到自己的博客里。

        废话不多数,直接说怎么干吧

        前面的步骤跟其他博客差不多:

1 先建一个JniUtils类,然后编写加载jni的代码

static {    System.loadLibrary("myjni");}
public native String stringFromJNI();

2 build->make project生成.class文件

3 打开terminal,cd app/src/main,  javah -d  jni  -classpath 包名.类名     然后自动在生成jni目录,并在该目录下生成.h文件

在src\main\jni\目录内新建一个名称为CMakeLists.txt的文件(该文件名称固定为CMakeLists.txt),内容为

cmake_minimum_required(VERSION 3.4.1)

add_library(myjni SHARED native-lib.cpp)

find_library(log-lib log)

target_link_libraries(myjni ${log-lib})

注:为了区别两个地方我特意用了两个名字 :在add library和target link libraries中的myjni必须是一致的,用在

static {    System.loadLibrary("native-lib");}

在add library 中的native-lib.cpp这个必须跟接下来新建的jni文件名一致。

其实我看了系统自动创建的项目中也有这个文件,而且里面代码很多,仔细看的话其实也就是这核心的4段代码,其他都是注释

5 点击IDE菜单File -> Link C++ Project with Gradle

Build System选择CMake Project Path选择上面创建的CMakeLists.txt 实际上就是在app的build.gradle的android节中新增了
externalNativeBuild {    cmake {        path 'src/main/jni/CMakeLists.txt'    }}

点击IDE的Sync Project With Gradle Files

jni的部分基本就完事了,下面就是jni编程

在java文件中添加native代码


static {    System.loadLibrary("myjni");}public native String helloJni();

鼠标点击放到native函数上

会提示Cannot resolve corresponding JNI function Java_com_example_jiang_hellojnitest_MainActivity_helloJni

按Alt + Enter点击Create...

在c文件中自动创建函数

JNIEXPORT jstring JNICALLJava_com_example_jiang_hellojnitest_MainActivity_helloJni(JNIEnv *env, jobject instance) {    // TODO    return (*env)->NewStringUTF(env, returnValue);}

修改函数实现


在java中用一个TextView显示jni函数的结果

运行即可看到jni函数成功执行


参考文档:https://blog.csdn.net/zahuopuboss/article/details/52804817

更多相关文章

  1. Android中Fragment的构造函数 his fragment should provide a de
  2. Android(安卓)HDecoration项目so库导出和调用
  3. [毕业设计-基于android的手机网盘的设计与实现] java中文件的soc
  4. Android(安卓)自己实现 NavigationView
  5. android多线程下载模块
  6. Android经常使用UI组件 - TextView
  7. [2] Android进程孵化图
  8. Tinker热修复简单接入
  9. Android(安卓)XMl文件存储及其解析

随机推荐

  1. 【2017年学习输出内容记录】Android系统
  2. Flutter Android(安卓)端热修复(热更新)实
  3. Android(安卓)应用程序窗体显示状态操作(r
  4. Android(安卓)Button及TextView动态变换
  5. Android(安卓)SQLite最简单demo实现(增删
  6. Android用Application设置全局变量以及使
  7. Android泡泡聊天界面的实现
  8. Android中的Looper类&Handler &Message
  9. 问题虽小,但是遇到会蛋疼!android蛋疼问题
  10. Android中 AsyncTask的使用