使用IntelliJ IDEA 编译Android JNI

来源:互联网 发布:阿里通网络客服电话 编辑:程序博客网 时间:2024/05/17 22:31

使用IntelliJ IDEA 编译Android JNI 

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

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

    构建一个基础的Android工程

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


.mk的代码

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

#include "demo.h"#include <jni.h>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编译了


so在这个路径下

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

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



0 0