1.cmd
2.cd 到src/main
3.javah -d jni -classpath C:\Android\sdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug cleanrobot.robot.com.myapplication.nativer.Nativer
4.build.gradle 配置ndk环境编译c/c++
apply plugin: 'com.android.application'
task ndkBuild(type: Exec) {
commandLine 'C:\\Users\\chuo_qin\\AppData\\Local\\Android\\android-ndk-r11b\\ndk-build.cmd','-C', file('src/main').absolutePath
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
android {
sourceSets {
main {
jni.srcDirs = [] //屏蔽gradle的jni生成过程
jniLibs.srcDir 'src/main/libs'
}
}
}
5.注意事项
错误1:
Error:error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'
c写法
jclass clz = (*env)->FindClass(env,"cleanrobot/robot/com/myapplication/nativer/ActivityTestNative");
c++写法
jclass clz = env->FindClass("cleanrobot/robot/com/myapplication/nativer/ActivityTestNative");
错误2:
g_ctx.activityTestNativeClz = env->NewGlobalRef(clz);
invalid conversion from 'object {aka _jobject*}' to 'jclass {aka _jclass*}'
g_ctx.activityTestNativeClz =(jclass) env->NewGlobalRef(clz);
错误3:
线程结束时记得调用
g_ctx.javaVM->DetachCurrentThread();
6.Error:error: 'string' was not declared in this scope
Application.mk添加以下加以支持APP_STL := gnustl_static
.cpp文件 添加 #include <string> using std::string; 或者 #include <string> using namespace std;
7.can pass objects of 'std::string {aka class std::basic_string
string s = "123"; LOGE("S = %s",s.data()); c 指支持char *, char[]两种类型