jni笔记

来源:互联网 发布:免费边缘融合软件 编辑:程序博客网 时间:2024/05/18 02:35

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[]两种类型

0 0