Android-JNI使用详解
来源:互联网 发布:淘宝商城女装秋装睡衣 编辑:程序博客网 时间:2024/06/06 01:36
NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;比如Framework层启下就会经常用,首先进官网和SDK下载地址一样https://developer.android.google.cn/ndk/downloads/index.html,然后其实包里面有sample,例子可以看。
1、新建一个类,声明native方法。这个类是java与C/C++交互的中介,方法由java声明,由C/C++实现。
不在Activity类里面写是为了避免编译时报错:找不到android.support.v7.app.AppCompatActivity
public class myJNI { //加载so库 static { System.loadLibrary("JniTest"); } //native方法 public static native String sayHello();}
2、打开android studio终端,使用javac编译上述文件,生成class文件。
命令:
D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni>javac myJNI.java
3、确认自己类的包名!然后在上一级的位置使用javah生成.h头文件
一定要在上一级哦,不然不会报错:找不到xxx类
比如我的myJNI.class在
D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni
我的包名是:
package com.example.binbin.testjni;
所以我的javah命令应该这么写:
D:\AndroidStudioProject\testJNI\app\src\main\java>javah -jni com.example.binbin.testjni.myJNI
注意:javac编译的时候进入到类最深目录 然后javac 类名.java,而javah的时候进入到包名的上一级目录javah 包名.类名
然后就能看到生成了一个h文件。
4、新建一个jni文件夹,新建jnitest.c(名字随意),把.h里面的内容复制进去,并实现里面的函数。
生成的h文件
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_binbin_testjni_myJNI */#ifndef _Included_com_example_binbin_testjni_myJNI#define _Included_com_example_binbin_testjni_myJNI#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_binbin_testjni_myJNI * Method: sayHello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif
拷贝修改后的jnitest.c
注意:很多人拷贝的时候会忘记给
(JNIEnv *, jclass);加上参数,会编译出错JNIEnv *env, jclass jobj)
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_binbin_testjni_myJNI */#ifndef _Included_com_example_binbin_testjni_myJNI#define _Included_com_example_binbin_testjni_myJNI#ifdef __cplusplusextern "C" {#endif/* * Class: com_example_binbin_testjni_myJNI * Method: sayHello * Signature: ()Ljava/lang/String; *///就实现了个函数 JNIEnv的用法可以自行百度,这里就不展开了JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello (JNIEnv *env, jclass jobj){ //返回一句话 return (*env)->NewStringUTF(env,"JNI hahahahahahahaha");}#ifdef __cplusplus}#endif#endif
5、配置NDK
打开Project的local.properties文件添加NDK路径
打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名System.loadLibrary("JniTest");
ndk { moduleName "JniTest" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }
还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true
6、生成SO库
完成以上步骤之后,我们rebuild一下就可以生成so库了
在项目的app\build\intermediates\ndk\debug\lib路径下
7、配置so库 可做可不做
在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下
8、使用JNI
因为native方法声明成了静态的方法,在Activity里面直接调用myJNI类就行
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView)findViewById(R.id.text); //调用 text.setText(myJNI.sayHello()); }}
加上
- Android-JNI使用详解
- Android JNI 使用的数据结构JNINativeMethod详解 动态注册JNI
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- android JNI的使用示例详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- Android JNI 使用的数据结构JNINativeMethod详解
- 两个组合优化问题及算法
- I've been a blogger. This is my first blog.
- 堆,栈,堆栈
- 天气预报接口
- 类、对象、方法的实例
- Android-JNI使用详解
- 开始进入到视频课程教育领域,先来自我介绍;
- 函数型指针与回调函数
- win10hyper-v安装centos7
- 整数,浮点数在内存中的存储
- node链接MySQL数据库
- python字符串内建函数方法讲解
- 在Android Studio中修改VCS根目录
- Java学习路线