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

0x01 序言:

  泪从何处提及呢?其实很早之前就用过android studio写过c++,可是,可是一直没有成功生成过so文件,因此心中一直有一个纠结。。。为何不成功呢。。。java

直到今天,因为工做的缘故不得不从新拾起,应该是昨天,昨天就在写了,不过,没成功。android

0x02 网上的通常性操做

  一、建立一个项目。c++

  包名姑且用:com.tangh.test_so2

  二、新建一个类,和jni方法。程序员

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

    public native String getString();
}

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

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

  四、执行命令: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/48864189gradle

  五、而后写.cpp文件。实现它ui

#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,这就是引起了后续的一个问题了。。。。。spa

  六、在项目/src/app/main/下新建一个文件夹 jni。而后把.h文件.cpp文件,都存放进入,听过好像jni自己有bug,须要一个空的.c文件,因而我写了一个空的.cpp,空的.c文件

empty.c 和 FixBug.cpp
 七、固然,我是一直没成功,因而手动建立了。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

  八、顺便改一下。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的错误与,或者是我哪里配置没有弄好。。。。

  九、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都装了。。。。

相关文章
相关标签/搜索