使用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 := demo
LOCAL_SRC_FILES := demo.c
include $(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-bundle
sdk.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"
}
}
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在代码中省略
JniTest 包名一旦生成 .h文件 就不可随意更改 否则会加载不到函数