close

ndkBuild ( NDK_LIBS_OUT=$ModuleFileDir$/src/main/libs )

 

(Alt+T)
Tools -> Android -> SDK manager -> Tools -> External Tools


 

Name: ndkBuild

Description: ndkBuild

Program: C:\Android\ndk\ndk-build.cmd

Parameters: 
NDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk NDK_LIBS_OUT=$ModuleFileDir$/src/main/libs NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk V=1

Working directory: $ProjectFileDir$

 


ndkBuildClean ( NDK_LIBS_OUT=$ModuleFileDir$/src/main/libs )

 

Name: ndkBuildClean

Description: ndkBuildClean

Program: C:\Android\ndk\ndk-build.cmd

Parameters: 
NDK_PROJECT_PATH=$ModuleFileDir$/build/intermediates/ndk NDK_LIBS_OUT=$ModuleFileDir$/src/main/libs NDK_APPLICATION_MK=$ModuleFileDir$/src/main/jni/Application.mk APP_BUILD_SCRIPT=$ModuleFileDir$/src/main/jni/Android.mk V=1 clean

Working directory: $ProjectFileDir$

 

javah

 

Name: javah

Description: javah

Program: $JAVA_HOME$\bin\javah.exe

Parameters: -v -jni -d $ModuleFileDir$/src/main/jni $FileClass$

Working directory: $SourcepathEntry$

 

gradle.properties

 

android.useDeprecatedNdk=true

 

build.gradle ( jniLibs.srcDir "src/main/libs" )

 

android {
    compileSdkVersion 16
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "com.example.androidservice"
        minSdkVersion 9
        targetSdkVersion 16
        versionCode 1
        versionName "1.0"

        signingConfigs

        ndk{
            moduleName "RkGpio"
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.outputFile = new File(
                output.outputFile.parent,
                "com.example.androidservice"+"_${variant.productFlavors[0].name}.apk")
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            //shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfigs
        }
    }

    signingConfigs {
        debug {
            storeFile file("platform.jks")
            storePassword "android"
            keyAlias "xxxxxxx"
            keyPassword "xxxxxxx"
        }
    }

    productFlavors {
        usa {
            buildConfigField "int", "Product", "0"
        }
        eu {
            buildConfigField "int", "Product", "1"
        }
        de {
            buildConfigField "int", "Product", "2"
        }
    }

    dexOptions {
        preDexLibraries = false
        jumboMode = true
        javaMaxHeapSize "4g"
    }

    //externalNativeBuild {
    //    ndkBuild {
    //        path 'src/main/jni/Android.mk'
    //    }
    //}
 
   sourceSets.main{
        jni.srcDirs=[]
        //jniLibs.srcDir "src/main/jniLibs"
        jniLibs.srcDir "src/main/libs" 
    }

// add the following, then no need external tools
    task buildNative(type: Exec) {
        commandLine 'ndk-build.cmd', 'V=1', '-C', file('src/main').absolutePath
    }
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNative
    }

    task cleanNative(type: Exec) {
        commandLine 'ndk-build.cmd', 'V=1', '-C', file('src/main').absolutePath, 'clean'
    }
    clean.dependsOn cleanNative

}

 

local.properties

 

sdk.dir=C\:\\Android\\sdk
ndk.dir=C\:\\Android\\sdk\\ndk-bundle

 

New JNI Folder

 

JniFolder.png

 

 

Android.mk

 

LOCAL_PATH := $(call my-dir)

###########################################################
include $(CLEAR_VARS)
LOCAL_MODULE := gpioctrl
LOCAL_SRC_FILES := libgpioctrl.so
include $(PREBUILT_SHARED_LIBRARY)

###########################################################
include $(CLEAR_VARS)
LOCAL_MODULE    := libRkGpio
#LOCAL_CFLAGS := -D__GXX_EXPERIMENTAL_CXX0X__
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_C_INCLUDES += -I. -I..
LOCAL_CPPFLAGS := -fexceptions -frtti -std=c++11
LOCAL_C_INCLUDES := $(LOCAL_PATH)
LOCAL_LDLIBS := -L$(LOCAL_PATH)
LOCAL_LDLIBS += -L. -L.. -lgpioctrl
LOCAL_SRC_FILES := RkGpio.cpp
LOCAL_SHARE_LIBRARIES := libgpioctrl
include $(BUILD_SHARED_LIBRARY)

 

Application.mk

 

APP_ABI := armeabi-v7a
APP_STL := gnustl_static

 

RkGpio.h ( c plus plus 要用 extern "C" {  } 包裹起來 )

 

//
// Created by LEXRA on 2016/10/3.
//
#ifndef ANDROIDSERVICE_RKGPIO_H
#define ANDROIDSERVICE_RKGPIO_H

/////////////////////////////////////////////////////////////////////////////
// com.example.androidservice/.MyService
#define CLASS                    com_example_androidservice_MyThread
#define _CLASS                    "com/example/androidservice/MyThread"

#define NAME3(CLASS3, FUNC3)    Java_ ## CLASS3 ## _ ##native## FUNC3
#define NAME2(CLASS2, FUNC2)    NAME3(CLASS2, FUNC2)
#define NAME(FUNC)                NAME2(CLASS, FUNC)

/////////////////////////////////////////////////////////////////////////////
#define nativeSetGpioOutput            NAME(SetGpioOutput)
#define nativeSetGpioInput            NAME(SetGpioInput)
#define nativeGetGpioLevel            NAME(GetGpioLevel)


#if defined(__cplusplus) || defined(__CPLUSPLUS__)
extern "C" {
#endif

JNIEXPORT jint nativeSetGpioOutput(JNIEnv *env, jobject obj, jint id, jint level);
JNIEXPORT jint nativeSetGpioInput(JNIEnv *env, jobject obj, jint id);
JNIEXPORT jint nativeGetGpioLevel(JNIEnv *env, jobject obj, jint id);

#if defined(__cplusplus) || defined(__CPLUSPLUS__)
}
#endif

#endif //ANDROIDSERVICE_RKGPIO_H

 

RkGpio.cpp

 

//
// Created by LEXRA on 2016/10/3.
//
#include <signal.h>
#include <jni.h>

#include "RkGpio.h"
#include "gpioctrl.h"

// jint Java_com_example_androidservice_MyThread_nativeSetGpioOutput(JNIEnv *env, jobject obj, jint id, jint level)
jint nativeSetGpioOutput(JNIEnv *env, jobject obj, jint id, jint level) {
    return (jint)setGpioOutput(id, level);
}

jint nativeSetGpioInput(JNIEnv *env, jobject obj, jint id) {
    return (jint)setGpioInput(id);
}

jint nativeGetGpioLevel(JNIEnv *env, jobject obj, jint id) {
    return (jint)getGpioLevel(id);
}

 

.java

 

...
class MyThread extends Thread {
    static { System.loadLibrary("RkGpio"); }

    public native int nativeSetGpioOutput(int id, int level);
    public native int nativeSetGpioInput(int id);
    public native int nativeGetGpioLevel(int id);

    MyThread(String s) {
        super(s);
    }

    public void run() {
        ...
        nativeSetGpioOutput(1, 1);
        ...
    }
    ...
}
...

 

External Tools -> ndkBuild

 

ExternalTools.png



JniBuild.png
 

 


 

 

 

如果 run-time 出問題 [ E/memtrack(1873)  : Couldn't load memtrack module (No such file or directory) ], 請刪除以下3個資料夾 (如果存在的話) , 再重新編譯. 

"src/main/jniLibs/armeabi-v7a"
"src/main/libs/armeabi-v7a"
"src/main/obj"

 

 

 

 


Email: jasonc@mail2000.com.tw

 

 

arrow
arrow

    Lexra 發表在 痞客邦 留言(0) 人氣()