android studio native方法报错,第一个Android studio JNI程序

现在网上有很多实用JNI的教程,本文主要用于记录自己实现的方法和遇到的坑。

第一步,下载NDK.

NDK可以去谷歌Android developer上下载。国内也有些中国版网站可以下载。

第二步,编写java类,这个类是java和c/c++交互的中介,定义一些native的方法,具体实现由c/c++完成。

packagecom.example.jni;/*** Created by alexjie on 2017/5/14.*/

public classJNIDemo {static{

System.loadLibrary("newclient");

}public static nativeString sayHello();

}

上部代码分两块,静态代码块用于加载我们后续要生成的c/c++实现的.so库,第二部分为定义的一个native的本地方法,此方法将由C++实现。

第三步,生成.h头文件

使用Android Studio的终端Terminal。

5f77b8b9872d4a12c72aa0943cd4a647.png

进入到main目录下 F:\Andriod\workspaceAS\Demo\newclient\src\main>  ,使用命令生成.h头文件 javah -d jni -classpath ./java com.example.jni.JNIDemo

-d jni 头文件生成到jni文件夹(当前在\app\src\main目录下,所以.h所在的目录为\app\src\main\jni )

-classpath ./java 指定去当前路径下java下寻找包名指定的类

然后就会在main文件夹下生成jni文件夹和com_example_jni_JNIDemo.h

/*DO NOT EDIT THIS FILE - it is machine generated*/#include

/*Header for class com_example_jni_JNIDemo*/#ifndef _Included_com_example_jni_JNIDemo

#define _Included_com_example_jni_JNIDemo

#ifdef __cplusplus

extern"C"{

#endif/** Class: com_example_jni_JNIDemo

* Method: sayHello

* Signature: ()Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello

(JNIEnv*, jclass);

#ifdef __cplusplus

}

#endif

#endif

第四步,实现main.cpp

.h头文件生成了,现在要实现C++的具体实现,新建一个C++文件:

47cb2ffd6395a90729a6db13e7d4d8db.png

然后会生成一个main.cpp文件,将.h文件的内容拷入到main.cpp文件,并做具体实现:

//

//Created by alexjie on 2017/5/14.//

/*DO NOT EDIT THIS FILE - it is machine generated*/#include

/*Header for class com_example_jni_JNIDemo*/#ifndef _Included_com_example_jni_JNIDemo#define _Included_com_example_jni_JNIDemo#ifdef __cplusplusextern "C"{#endif

/** Class: com_example_jni_JNIDemo

* Method: sayHello

* Signature: ()V*/JNIEXPORT jstring JNICALL Java_com_example_jni_JNIDemo_sayHello(JNIEnv*env, jobject jobj){//返回一句话

return env->NewStringUTF((char *)"JNI hahahahahahahaha");

};

#ifdef __cplusplus

}#endif

#endif

第五步,配置NDK

打开Project的local.properties文件添加NDK路径

48bf0d15513523fb7d7f95dacf3ecbe1.png

打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码

注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名

ndk {

moduleName"newclient"ldLibs"log", "z", "m"abiFilters"armeabi", "armeabi-v7a", "x86"}

73a43931b9e76819196708c174850132.png

在gradle.properties里面加上这么一句话:

android.useDeprecatedNdk=true

44feb0281e8f2ba06ac796a11e4fb693.png

第六步,生成.so库

rebuilt项目,在如下目录会生成.so库:app\build\intermediates\ndk\debug\lib

在main文件夹下,新建一个jnilib文件夹,将.so库考到其中。

c382cb1950e3d73cf079ef2a76342ac3.png

现在在程序中就可以调用JNIDemo.sayHello()方法了。

问题:

1.build apk时,报错:installation failed with message failed to establish session

解决:关闭MIUI开发者选项中的MIUI优化并重启!

原文:http://www.cnblogs.com/Alexwsj/p/6858175.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值