0x01 序言:

  泪从何处说起呢?其实很早以前就用过android studio写过c++,但是,但是一直没有成功生成过so文件,所以心中一直有一个纠结。。。为什么不成功呢。。。

直到今天,由于工作的缘故不得不重新拾起,应该是昨天,昨天就在写了,不过,没成功。

0x02 网上的一般性操作

  1、创建一个项目。

  包名姑且用:com.tangh.test_so2

  2、新建一个类,和jni方法。

public class JniUtil {
static {
System.loadLibrary("hello");
} public native String getString();
}

  生成(build)一下,查看 项目名称\app\build\intermediates\classes\debug\com\tangh\test_so2\JniUtil.class文件

  3、返回到 classes\debug\下 shift+鼠标右键,在此处打开命令窗口

  4、执行命令:javah -jni com.tangh.test_so2.JniUtil  会在 debug下生成一个  com_tangh_test_so2_JniUtil.h文件。。。

  

extern "C" {
#endif
/*
* Class: com_tangh_test_so2_JniUtil
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_tangh_test_1so2_JniUtil_getString
(JNIEnv *, jobject); #ifdef __cplusplus
}

  方法名变了。在下划线前面加了一个数字,参考:https://blog.csdn.net/sambillyr/article/details/48864189

  5、然后写.cpp文件。实现它

#include <jni.h>
#include "com_tangh_test_so2_JniUtil.h"
JNIEXPORT jstring JNICALL Java_com_tangh_test_1so2_JniUtil_getString
(JNIEnv *env, jobject thiz){
return env->NewStringUTF("hello jni!");
}

  处于,好看,我把函数名字改动了一下,去掉了那个1,这就是引发了后续的一个问题了。。。。。

  6、在项目/src/app/main/下新建一个文件夹 jni。然后把.h文件.cpp文件,都存放进入,听过好像jni本身有bug,需要一个空的.c文件,于是我写了一个空的.cpp,空的.c文件

empty.c 和 FixBug.cpp
 7、当然,我是一直没成功,于是手动创建了。Android.mk和一个Application.mk文件
Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello
LOCAL_SRC_FILES := com_tangh_test_so2_JniUtil.cpp \
empty.c \
FixBug.cpp include $(BUILD_SHARED_LIBRARY)

  Application.mk

APP_PLATFORM = android-16
APP_ABI := armeabi-v7a

  8、顺便改一下。build.gradle...

defaultConfig {
applicationId "com.tangh.test_so2"
minSdkVersion 16
targetSdkVersion 24
versionCode 1
versionName "1.0"
ndk{
moduleName "hello"
abiFilters "armeabi-v7a", "x86"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets.main {
jniLibs.srcDir '/src/main/jniLibs'
jni.srcDirs = [] //disable automatic ndk-build call
} // 部分内容省略了。

  。。。jni.srcDirs设置成空,意思就是手动生成so.

给路径就是告诉ide,你来给我生成。当然,两种方法都试了。都有错误。那么不生成。要么我在jni目录下执行ndk-build命令。。报错 XXXXXXXXXXX Error 1..

我一直以为是nkd的错误与,或者是我哪里配置没有弄好。。。。

  9、Q群求助。。结果别人居然可以编译,我就纳闷了,于是把ndk拷贝到,虚拟机,安装jdk,真的可以。。。。原谅我的PC机,他已经老了,可能年久失修,,,

  10,好吧,算解决了。但是 so生成了,拷贝回来了。放在了。目录/src/main/jniLibs/armeabi-v7a/libhello.so ....但是,编译之后没问题。

运行起来,app退出了,找不到native函数,我用ida看了一下,有这个函数啊,,,,想到,函数名称,把“.”,变成了下划线"_"...难道是我的下划线。。。。

突然心中一万只(XXX)飞过,好吧,百度一下。改回去,重新生成,重新。。。,,,成功了。。

  11.。真的成功了,突然成就感爆棚。。。。好吧,这个问题,我困扰我很久了。发个红包,庆祝一下。

0x02 总结

  有时候,一个问题,不一定是代码的问题,环境也可能是一个困扰你不得其所的大问题。换个思路,让别人也试试,说不定你会有新发现。同时也告诉我们,作为一个程序员,应该有多个环境。

一个干净的环境,能够更好地甄别问题所在,而不是像我的PC机一样,1T的硬盘,只有不到100G了,大多数软件都装了。。这么说吧。

vs2010,2012,2013,2015都装了。。。。

Android studio,第一个生成,调用成功的jni(说多了都是泪)的更多相关文章

  1. 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...

  2. Android开发教程 - 使用Data Binding Android Studio不能正常生成相关类/方法的解决办法

    本系列目录 使用Data Binding(一)介绍 使用Data Binding(二)集成与配置 使用Data Binding(三)在Activity中的使用 使用Data Binding(四)在Fr ...

  3. Android项目实战(二十五):Android studio 混淆+打包+验证是否成功

    前言: 单挑Android项目,最近即时通讯用到环信,集成sdk的时候 官方有一句 在 ProGuard 文件中加入以下 keep. -keep class com.hyphenate.** {*;} ...

  4. Android Studio 配置快速生成模板代码

    前言 Android studio 有提供快速生成模板代码的功能,其实这个功能也可以自定义配置.此篇博客将讲解如何使用此功能 进入Settings 选择 Editor > Live Templa ...

  5. Android Studio如何快速生成get,set,tostring,构造函数

    刚开始使用Android Studio时,在创建一个javabean时,很习惯的在JavaBean类中,右键去找生成get,set等选项.但是很遗憾,找不到. 那这边如何快速的set,get或者生成构 ...

  6. Android Studio 之 打包生成的 apk 安装包装到手机上闪退

    今天,在 Android Studio 中的模拟器中测试 app 程序正常,然后打包 apk 安装包程序,发给领导后,领导反馈安装后打开闪退,抓紧安装到自己手机上,发现果然存在闪退.查阅资料后,解决方 ...

  7. [Android Studio] Android Studio如何快速生成get,set,tostring,构造函数

    刚开始使用Android Studio时,在创建一个javabean时,很习惯的在JavaBean类中,右键去找生成get,set等选项.但是很遗憾,找不到. 那这边如何快速的set,get或者生成构 ...

  8. android studio 插件开发(自动生成框架代码插件)

    android studio 插件开发 起因 去年公司开始上新项目,正好android在架构这方面的讨论也开始多了起来,于是mvp架构模型就进入我们技术选择方案里面,mvp有很多好处,但是有一个非常麻 ...

  9. Android Studio 2.3.3 调用asp.net webService实战(拒绝忽悠)

    1.路径中不能包含localhost(本来想在本机调试,就是不行,没办法发布到远程服务器) 2.必须采用异步的办法(阻塞主线程的是肯定不行了) 3.以下是全部的源代码(毫不保留) package co ...

随机推荐

  1. [Swift]LeetCode794. 有效的井字游戏 | Valid Tic-Tac-Toe State

    A Tic-Tac-Toe board is given as a string array board. Return True if and only if it is possible to r ...

  2. Jquery的详细解析和用法

    一.Jquery简介 Jquery是一个优秀的Javascrīpt框架.它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0+, FF 1.5+, Safari  ...

  3. Firefox 多行标签的解决方案分享

    更新了 Quantum 以后 TabMixPlus 就不能用了,我最中意的多行标签也没了,捣鼓了一下终于重新回来了. 指南: https://discourse.mozilla.org/t/tabs- ...

  4. 英语笔记3(git)

    一: To create a new branch and switch to it at the same time, you can run the git checkout command wi ...

  5. 汇编语言 实验14 访问CMOS RAM

    汇编语言 访问CMOS RAM CMOS RAM 是什么? 存放计算机开机必备的一些数据的硬件,由BIOS(Basic input/output system)调用其数据. 怎么用? 首先要理解端口的 ...

  6. Docker技术知识点总结

    Docker技术知识点总结 本文宿主机环境Centos7.4Docker version 18.09.2, build 6247962采用国内 Daocloud 加速器---------------- ...

  7. 程序员如何面试才能拿到offer

    一.概述 面试,难还是不难?取决于面试者的底蕴(气场+技能).心态和认知及沟通技巧.面试其实可以理解为一场聊天和谈判,在这过程中有心理.思想上的碰撞和博弈.其实你只需要搞清楚一个逻辑:“面试官为什么会 ...

  8. 『Candies 差分约束系统』

    差分约束系统 我们先来认识一下差分约束系统鸭! 差分约束系统是一种特殊的\(n\)元一次不等式组,它包含了\(n\)个变量\(x_1-x_n\)以及\(m\)个不等式(约束条件).其中每一个不等式形如 ...

  9. Ocelot + Consul实践

    关于Consul(https://www.consul.io)是一个分布式,高可用,支持多数据中心的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla ...

  10. Android中,粗暴的方式,修改字体

    序 在 Android 下使用自定义字体已经是一个比较常见的需求了,最近也做了个比较深入的研究. 那么按照惯例我又要出个一篇有关 Android 修改字体相关的文章,但是写下来发现内容还挺多的,所以我 ...