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. 浅谈Java的主要学习要点_上海尚学堂java培训课程思维导图

    Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥 ...

  2. 花点时间顺顺Git(上)

    花点时间顺顺Git(上) 为了让你们点进来贼努力的想了一个色彩斑斓大吉大利的标题,好,看正文 历史:Linus的作者创建了开源的Linux,02年以前代码管理都依赖手动合并,后来管理不了了,拒绝SVN ...

  3. NPM 安装速度慢,镜像修改

    今天安装gitbook的时候,竟然花了两个小时没有安装成功,大家在使用npm安装依赖的时候速度是不是经常慢的要死?最佳解决方案是手动更改镜像服务器地址, 强烈推荐阿里巴巴在国内的镜像服务器,执行下面命 ...

  4. 文本主题模型之非负矩阵分解(NMF)

    在文本主题模型之潜在语义索引(LSI)中,我们讲到LSI主题模型使用了奇异值分解,面临着高维度计算量太大的问题.这里我们就介绍另一种基于矩阵分解的主题模型:非负矩阵分解(NMF),它同样使用了矩阵分解 ...

  5. NET快速信息化系统开发框架 V3.2 -> “用户管理”主界面使用多表头展示、增加打印功能

    RDIFrameowrk.NET 用户管理是使用非常频繁的模块,由于需要展示的字段比较多,以前的展示方式显得不是太规范,现3.2版本用户管理主界面进行了全新的设计,数据列表展示使用了Dev家族全新的G ...

  6. oracle数据库密码过期修改注意事项

    近期的工作中,因数据库密码临近过期,需要进行修改,因对oracle数据库底层结构不了解,导致安装网上的教程操作是出现一些问题,特记录下来 传统的修改语句为 输入:win+R进入cmd  输入sqlpl ...

  7. MySQLSource-Flume

    1. 自定义Source说明 实时监控MySQL,从MySQL中获取数据传输到HDFS或者其他存储框架,所以此时需要我们自己实现MySQLSource. 2. 自定义MySQLSource步骤 根据官 ...

  8. 自定义封装ajax,复制即可用

    支持get.post请求 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  9. Scala(四) —— 集合

    一.List var x = List(1,2,3,4) //x:List[Int] = List(1, 2, 3, 4) var y = List("x","y&quo ...

  10. 第58章 Profile Service - Identity Server 4 中文文档(v1.0.0)

    IdentityServer通常在创建令牌或处理对userinfo或内省端点的请求时需要有关用户的身份信息.默认情况下,IdentityServer仅具有身份验证cookie中的声明,以便为此身份数据 ...