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
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
如果 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
文章標籤
全站熱搜