使用IntelliJ IDEA 编译Android JNI 

   -------------致一些想要编译android so文件  又不想多装一个Android studio童鞋

   当然 首先还是要装Android SDK  以及下载 Android NDK配置到环境变量  NDK查了下貌似IDEA没办法导入 这个下面会讲到

    构建一个基础的Android工程

使用IntelliJ IDEA 编译Android JNI_第1张图片

JniTest中的代码

public class JniTest {    public native String getString(String str);}
native 标识是c/c++的入口函数

命令行cd 到app/src/main/java 路径下

输入如下命令 javah -jni 包名.类名

javah -jni com.example.jni.myapplication.JniTest


会生成这样一个.h文件 这个文件名是可以重命名的

在main路径下创建jni文件夹

将刚才的.h文件移到这个目录下面 并创建Android.mk 和 .cpp文件

使用IntelliJ IDEA 编译Android JNI_第2张图片

.mk的代码

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := demoLOCAL_SRC_FILES := demo.cinclude $(BUILD_SHARED_LIBRARY)
.cpp代码

#include "demo.h"#include JNIEXPORT jstring JNICALL Java_com_example_jni_myapplication_JniTest_getString(JNIEnv *env , jobject obj, jstring ssss){    char *str = "hello from c";    jstring jstr = (**env).NewStringUTF(env, str);    return jstr;}


关于java 和 c++类型转换 比较复杂 http://blog.sina.com.cn/s/blog_5e357d2d01012cu3.html  可以参考一下这篇文章


接下来就是编译部分

首先 在local.properties 中加入如下代码

ndk.dir=/Users/admin/Library/Android/sdk/ndk-bundlesdk.dir=/Users/admin/Library/Android/sdk
sdk目录一般都是一件创建了

ndk路径就是你下载下来的ndk的路径  这个配置是idea不加载ndk编译jni的关键

src 的build.gradle下配置如下

    defaultConfig {        applicationId "com.example.jni.myapplication"        minSdkVersion 19        targetSdkVersion 23        versionCode 1        versionName "1.0"        ndk {            moduleName"testLib"            ldLibs "log", "z", "m"            abiFilters "armeabi", "armeabi-v7a", "x86"        }    }

在gradle.properties 中加入如下代码

android.useDeprecatedNdk=true

否则会报

NDK integration is deprecated in the current plugin.  Consider trying the new experimental plugin.  For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental.  Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.

这个异常

然后就可以make project编译了

使用IntelliJ IDEA 编译Android JNI_第3张图片

so在这个路径下

public class JniTest {    static {        System.loadLibrary("testLib");    }    public native String getString(String str);}
lib在代码中省略
这个类加so  就可以发布了  

JniTest 包名一旦生成 .h文件  就不可随意更改  否则会加载不到函数



更多相关文章

  1. android studio修改配置文件(.android .gradle .AndroidStudio)
  2. Android NDK系列(三)-AS编写C文件没有提示和不识别NULL
  3. Android开发之文件下载
  4. 解决android中使用shape文件画虚线不显示
  5. Android Native代码中的status_t定义
  6. Android 混淆代码问题总结
  7. AndroidManifest.xml文件剖析 (二)
  8. 在android中显示网络图片及查看页面源代码

随机推荐

  1. javascript入门笔记(1)——变量和计算
  2. js关于Function.prototype.bind
  3. RichFaces 3.3.3 和 JSF 2.0
  4. js中ajax获取json数据遍历提示undefined
  5. 在单选按钮上选中/取消选中,加载/隐藏部分
  6. javascript 的MD5代码备份,跟java互通
  7. 使用AngularJS隐藏滚动div
  8. 简单实现一个文件上传的进度条
  9. 如何在当前视图中始终保持水平底部滚动条
  10. JavaScript(ES5)使用保留字作函数名