使用IntelliJ IDEA 编译Android JNI
使用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 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文件 就不可随意更改 否则会加载不到函数
更多相关文章
- android studio修改配置文件(.android .gradle .AndroidStudio)
- Android NDK系列(三)-AS编写C文件没有提示和不识别NULL
- Android开发之文件下载
- 解决android中使用shape文件画虚线不显示
- Android Native代码中的status_t定义
- Android 混淆代码问题总结
- AndroidManifest.xml文件剖析 (二)
- 在android中显示网络图片及查看页面源代码