美文网首页
NDK 重拾一下

NDK 重拾一下

作者: 卖梦想的男孩 | 来源:发表于2016-12-18 18:24 被阅读296次

周末帮小弟弟看一个NDK的问题,回首又温习了一下NDK的部分知识,留个笔头。

1.新版AS中NDK 简单使用

  • 新建一个Android项目勾上Include C++ Support ,会自动生成cpp目录
  • C++ Standard:使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的 CMake 设置。
  • Exceptions Support:是否启用对 C++ 异常处理的支持
  • Runtime Type Information Support:是否启用运行时类型信息
    这里简单写一个小Demo 更多信息
    native-lib.cpp
#include <jni.h>
#include <string>
extern "C"
jstring
Java_cn_kerison_demo_ndk_MainActivity_stringFromJNI(        JNIEnv *env,        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}
extern "C"
jstring
Java_cn_kerison_demo_ndk_MainActivity_getPackageName(        JNIEnv *env,        jobject _this,       jobject context) {
    jclass contextClass = env->FindClass("android/content/Context");
    jmethodID methodID = env->GetMethodID(contextClass,"getPackageName","()Ljava/lang/String;");
    jstring result = (jstring) env->CallObjectMethod(context, methodID);
  const char *chars = env->GetStringUTFChars(result, false);
if (chars != NULL) {
    env->ReleaseStringUTFChars(result, chars);
    return env->NewStringUTF(chars);
}
return NULL;
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
    static {
        //加载库文件
        System.loadLibrary("native-lib");   
 }   
 @Override    
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
       TextView tv = (TextView) findViewById(R.id.sample_text); 
        //调用native方法
       tv.setText(String.format("%s [%s]",stringFromJNI(),getString(this)));    
}
//声明native方法
public native String stringFromJNI();
 public native String getString(Context context);
}

2.NDK 编译方式

  • NDK-Build
    以前的NDK开发都是用NDK-Build编译的,依赖文件Android.mk。 详情
#调用宏my-dir切换到当前工程目录
LOCAL_PATH := $(call my-dir) 
# 清除除了LOCAL_PATH以外的LOCAL_XXX临时变量
include $(CLEAR_VARS) 
#编译生成的文件的类库叫什么名字
 LOCAL_MODULE := hello 
#要编译的c文件
LOCAL_SRC_FILES := Hello.c 
#编译的架构类型
TARGET_ARCH_ABI := All
#编译库的类型脚本
include $(BUILD_SHARED_LIBRARY)
  • CMake
    新版的AS已经推荐直接使用CMake,CMake 构建脚本是一个纯文本文件,依赖文件CMakeLists.txt。
#设置CMake 的版本要求
cmake_minimum_required(VERSION 3.4.1)
#设置编译的库
add_library(
 #设置库名 
native-lib  
#设置库的类型 
SHARED
#设置库需要编译的文件
src/main/cpp/native-lib.cpp )
# 指定库的头文件目录
include_directories(src/main/cpp/include/)
#检查依赖的库
find_library(
#库的路径
log-lib
#库的名字
 log )
#链接第三方库到目标库中
target_link_libraries(
#要链接库的名字
# native-lib
#链接的库
${log-lib} )

3.编译脚本指定

android {
  ...  
defaultConfig {
 ...    
externalNativeBuild {
    //指定编译类型
      cmake {...} 
     // or ndkBuild {...}
    }   
 ndk {
      //指明apk需要打包的架构类型
     abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a','arm64-v8a'   
 }
  }  
buildTypes {...}
externalNativeBuild {
    cmake {   
      path "CMakeLists.txt"
    }
  // or ndkBuild {...}
 }
}

4.NDK注意事项

  • 一般NDK导出的包为[lib+库名称.so]使用时,系统会自动忽略识别lib字段和so扩展名
static {    
System.loadLibrary(“native-lib”);
}
  • 出现故障问题不编译或非代码问题,build下clean或refresh linked C++
  • C/C++中的字符串和java的字符串需要进行转换
  • C++ 使用时要兼容C模式: extern "C"
  • 方法签名一定更要写对,可用javap命令查看签名或者javah生成头文件。
Java 类型 类型签名
boolean Z
byte B
char C
short S
int I
long L
float F
double D
Class (L+类的全路径+;),L是前缀,;是结束符,.用/代替,比如String, 其签名为Ljava/lang/util/String;
Array [类型签名, 比如 [B
  • 类型对照
java jni
char jchar
byte jbyte
short jshort
int jint
long jlong
float jfloat
double jdouble
boolean jboolean

相关文章

  • NDK 重拾一下

    周末帮小弟弟看一个NDK的问题,回首又温习了一下NDK的部分知识,留个笔头。 1.新版AS中NDK 简单使用 新建...

  • NDK开发初探

    最近项目需求少,学习一下NDK开发,下面是对NDK开发的初步探索,Android Studio版本3.0.1。 1...

  • Android NDK初体验(上)

    以前学了一点NDK相关的知识,这篇文章主要总结回顾一下。NDK是一种帮助我们开发C/C++代码的工具,NDK的开发...

  • NDK Commands

    ndk-build NDK_LOG=1 ndk-build NDK_PROJECT_PATH=. ndk-buil...

  • NDK、jni、Binder、AIDL、进程通信有关

    请介绍一下NDK 什么是NDK库? jni用过吗? 如何在jni中注册native函数,有几种注册方式? Java...

  • ndk的配置及使用

    ndk 配置及使用 参考这个文章练习使用了一下ndk,基础的搭建这个博客说的很详细了,我就简单写一下中间可能没注意...

  • Hello NDK!

    NDK 开发变得越来越重要,接下来介绍一下 Android Studio 下 NDK 开发环境配置:功能需求:1....

  • 总结一下Eclipse环境下用NDK编译JNI使用的.so库的详

    总结一下Eclipse环境下用NDK编译JNI使用的.so库的详细步骤: 1.下载NDK(注意区分32位/64位系...

  • Unity打包环境(sdk,ndk)

    哈哈做了好几年了,每次换电脑装环境都要重新查,这次记一下,,, 一、ndk 按照unity提示,需要下载NDK(1...

  • Android NDK开发之旅 目录

    Android NDK开发之旅 目录 Android NDK开发之旅1--NDK介绍Android NDK开发之旅...

网友评论

      本文标题:NDK 重拾一下

      本文链接:https://www.haomeiwen.com/subject/hafzmttx.html