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