LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := demoLOCAL_SRC_FILES := demo.cppinclude $(BUILD_SHARED_LIBRARY)

android中用到的so文件是一个c/c++的函数库。在android的JNI中,要先将相应的C语言打包成so库,然后导入到lib文件夹中供java调用。

概览:

一、Android Studio NDK配置

二、so库开发

三、调用so借口,实现借口输出

四、遇到问题

一、Android Studio NDK配置

1、进入Android studio --> 创建工程-->右键当前工程 => Open Moudle Setting => Android SDK location -->配置Android NDK location

2、配置环境变量

找到安装的ndk-bundle路径配置系统环境变量,如我的在D:\Android\AndroidSDK\ndk-bundle可以在系统环境变量中配置PATH=...;D:\Android\AndroidSDK\ndk-bundle    打开CMD窗口,若已经打开需要重新打开。

如下表示已经成功配置:

C:\Users\Administrator>ndk-build

    Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
D:\Android\AndroidSDK\ndk-bundle\build\\..\build\core\build-local.mk:151: *** An
droid NDK: Aborting    .  Stop.

二、创建so文件

工程目录建立需要调用native函数的.java文件,如下:

package clove.hellojni;public class HelloJIN {    static {        System.loadLibrary("demo");    }    public native String helloJNI();}
进入类文件位置目录:javac编译 HelloJIN.java,生成HelloJIN.class

进入包目录前已经目录:javah -jni 包名.类名

生成c/c++依赖的.h文件xx_nn.h

app目录新建jni目录:jni目录下新建.c/.cpp文件,实现native借口,如demo.cpp

 #include  #include  #include "D:\AndroidStudioProjects\HelloJNI\app\src\main\java\clove_hellojni_HelloJIN.h"JNIEXPORT jstring JNICALL Java_clove_hellojni_HelloJIN_helloJNI(JNIEnv *env, jobject thiz){    return env->NewStringUTF((char *)"Hello from JNI !");}
jni目录建立编译文件Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := demoLOCAL_SRC_FILES := demo.cppinclude $(BUILD_SHARED_LIBRARY)
注意实现native借口文件为.c是需要 LOCAL_SRC_FILES := demo.cpp改为 LOCAL_SRC_FILES := demo.c

进入app目录:命令ndk-build进行编译.so文件,编译完成后生成libdemo.so文件在libs目录下。

三、调用so接口:

在app的build.gradle的android节点下设置:

sourceSets{        main{            jniLibs.srcDirs = ['libs']        }    }
在调用native接口java文件实现:
package clove.hellojni;/** * Created by clove.xie on 2016/9/10. */public class HelloJIN {    static {        System.loadLibrary("demo");    }    public native String helloJNI();}

 注意在实现native接口是c/cpp的区别,   

四、注意问题:

error: base operand of '->' has non-pointer type '_JNIEnv'  

调用的代码这么来写: //return (*env)->NewStringUTF(env, "Hello from JNI !");//如果是用C语言格式就用这种方式
      //return env->NewStringUTF((char *)"Hello from JNI !");//C++用这种格式








更多相关文章

  1. Android(安卓)EditText输入框被键盘遮挡问题解决
  2. android 调用前摄像头进行拍照的方法及完整例子
  3. Android-常用UI控件(Spinner/AutoCompleteTextView)
  4. Android+JNI调用–文件操作
  5. Android(安卓)视图绑定,找不到类 'ResultProfileBinding'
  6. Android应用程序使用Localsocket与Linux层通信
  7. Android国际化
  8. 动态设置android:drawableLeft|Right|Top|Bottom
  9. NPM 和webpack 的基础使用

随机推荐

  1. Java 8 最快的垃圾搜集器是什么?
  2. Java 8 日期 / 时间( Date Time )API 指南
  3. Java 到底是传引用还是传值
  4. 成为 Java GC 专家( 2 ):如何监控 Java 垃圾
  5. Java 开发者写 SQL 时常犯的 10 个错误
  6. 成为 Java GC 专家( 3 ): 如何优化 Java 垃
  7. 说说 Java 代理模式
  8. 成为 Java GC 专家( 4 ): Apache 的 MaxCli
  9. Lucene 五分钟教程
  10. 在 Java 中如何使用 transient