Android studio简单使用JNI实例

准备工作:下载NDK。

简单的说,要用到C/C++,就要用NDK。直接百度搜索然后去官网下载就行,位置可以随便放。或者去AndroidStudio–>Settings–>Plugins中去下载NDK然后重启AndroidStudio就可以。

 

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文件。

Android studio简单使用JNI实例_第1张图片

 

命令:

D:\AndroidStudioProject\testJNI\app\src\main\java\com\example\binbin\testjni>javac myJNI.java

或者make build一下,也会生成class文件!!!

 

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

 

Android studio简单使用JNI实例_第2张图片

然后就能看到生成了一个h文件。

 

4、新建一个jni文件夹,新建main.c,把.h里面的内容复制进去,并实现里面的函数。

 

生成的h文件

/* DO NOT EDIT THIS FILE - it is machine generated */#include /* 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

拷贝修改后的main.c

/* DO NOT EDIT THIS FILE - it is machine generated */#include /* 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路径(通过Settings-->Plugins安装NDK后重启AndroidStudio会自动配置)

Android studio简单使用JNI实例_第3张图片

  

  

打开app Module的build.gradle文件,在defaultConfig节点里添加以下代码
注意这里的moduleName,是我们在之前自己编写的类里面加载的so库名
 ndk {            moduleName "JniTest"            ldLibs "log", "z", "m"            abiFilters "armeabi", "armeabi-v7a", "x86"        }

 

Android studio简单使用JNI实例_第4张图片

 

  

还要在gradle.properties里面加上这么一句话:
android.useDeprecatedNdk=true

Android studio简单使用JNI实例_第5张图片

 

6、生成SO库

完成以上步骤之后,我们rebuild一下就可以生成so库了

在项目的app\build\intermediates\ndk\debug\lib路径下

 

7、配置so库

在src\main下新建文件夹jniLIB,并将生成的SO文件拷贝到该文件夹下

Android studio简单使用JNI实例_第6张图片

 

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 studio简单使用JNI实例_第7张图片

ok!

 

总结一下流程:

编写静态方法(用java声明)–>编译生成class文件—>编译生成h文件—->编写C文件(用C/C++实现)

—->配置NDK—->配置so库—->在Activity调用(Java调用C/C++)。

 

android studio虽然很多小问题,但也算很方便了,mk文件编辑器帮你弄好了,直接可以生成so库。

   

 

   

转载自:https://www.cnblogs.com/wzben/p/5733571.html

更多相关文章

  1. Android 动态加载布局文件
  2. Android大图片导致内存问题小结
  3. android 工程里缺少 R.java 文件原因和解决方法
  4. 使用pull解析器操作xml文件
  5. 解决android一直在running,打不开文件,下载不了gradle包的方法
  6. 【android开发】解析xml文件①
  7. 巧用布局文件实现Android中实现事件监听机制
  8. Android imageview图片缩放实现

随机推荐

  1. Android Studio安装及常见错误
  2. Android(安卓)知识点积累(一)
  3. 获得G1的电池电量信息
  4. AndroidStudio、gradle、buildToolsVersi
  5. sqlite c库使用
  6. Android Sensor详解(6)sensor framework层
  7. Android greenDao 使用教程(二) 在Eclipse
  8. Android中定义Viewport需要注意的几个数
  9. Baidu Map开发示例
  10. 【Android Developers Training】 74. 序