Mac電腦AndroidStudio2.2使用NDK開發JNI

很久沒有搞JNI了,據說AndroidStudio能夠調試C++了,今天把JNI開發再熟悉下。java

在AndroidStudio中能夠直接下載JNI開發的相關NDK和工具,不須要單獨下載NDK了。android

這樣,編譯JNI有兩種方式,ndk-build和CMakeapp

1、ndk-build方式工具

1. 新建Projectgradle

2. 建立Java類,添加本地方法ui

public class HelloJni {
    static {
        System.loadLibrary("hello-jni");
    }
    public static native String getJniString();

}

3. 選擇[build]->[Make Project]生成classthis

4. 使用javah命令生成.h文件spa

// 命令行進入
cd app/src/main
// 在src/main下生成jin文件夾和.h文件
javah -d jni -classpath ./java com.outman.myjni.HelloJni

5. 生成的com_outman_myjni_HelloJni.h文件以下.net

默認有2個參數,重點說下第二個參數插件

jclass java代碼方法,是static類型的,則生成的是jclass類型參數

jobject java代碼方法,是非static類型的,則生成的是jobject類型參數

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_outman_myjni_HelloJni */

#ifndef _Included_com_outman_myjni_HelloJni
#define _Included_com_outman_myjni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_outman_myjni_HelloJni
 * Method:    getJniString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_outman_myjni_HelloJni_getJniString
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

6. 在jni文件夾中建立cpp文件

#include <jni.h>
#include <com_outman_myjni_HelloJni.h>

JNIEXPORT jstring JNICALL Java_com_outman_myjni_HelloJni_getJniString
  (JNIEnv *env, jclass obj) {

    char *result = "this is call from JNI C++";
    jstring jstr = env->NewStringUTF(result);
    return jstr;
}

7. 在jni文件夾建立Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_C_INCLUDES+= $(LOCAL_PATH)
SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%)

LOCAL_SRC_FILES := $(SRC_FILES)

#LOCAL_LDLIBS    := -llog -landroid
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

8. [build]->[Make Project]編譯工程

若是未安裝XCode,會彈窗要求安裝,安裝便可

9. 配置gradle支持

有種簡單方法,就是經過AndroidStudio Link C++功能

選中Android.mk -> File -> Link C++ 選擇ndk-build,並選擇工程中的Android.mk文件

10. 完成後,會在build.gradle中生成ndk支持

android {
    defaultConfig {
        ndk{
            moduleName "hello-jni"
            abiFilters "armeabi"
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
}

11. gradle.properties中添加支持

android.useDeprecatedNdk=true

12. 完成以上,build工程便可生成.so文件

不過要注意,so沒有生成在lib下,而是在

app->build->intermediates->ndkBuild

但不影響使用

2、CMake方式

1. 下載完成插件後,新建Project時,選中Include C++ Support便可

2. 生成的Project會自動生成Demo,就不詳細介紹了。

3、ndk-build和CMake的一點區別

主要是配置的不一樣,再也不詳細描述,能夠參考另外一篇轉載的文章。

https://my.oschina.net/android520/blog/805249

相關文章
相關標籤/搜索