Android NDK 里面Samples里面有很多例子。我这里是第一个例子,从C++层返回一个String到Java层。然后显示在Android TextView上面。


我们新建一个Android工程,默认新建工程是没有jni文件夹的,我们自己新建一个(虾米,这东西有什么用? TT:这文件夹就是用来放NDK编译相关文件的)。


在jni文件里面,一定需要一个Android.mk文件,名字不能改成其它


这其实就是Linux中的Makefile文件,里面写的就是编译源文件的规则。


Android.mk:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_LDLIBS := -llogLOCAL_MODULE := HelloNDKLOCAL_SRC_FILES := HelloNDK.cinclude $(BUILD_SHARED_LIBRARY)


LOCAL_LDLIBS := -llog

加上这个库,我们就可以用来在C++中使用Android的Log输出了。


LOCAL_MODULE := HelloNDK

这是我们用NDK编译生成的动态链接库文件名,全名HelloNDK.so ,在Android中通过加载这个So文件来执行C++代码。我们可以在 \libs\armeabi\libHelloNDK.so 这里找到它。


LOCAL_SRC_FILES := HelloNDK.c

HelloNDK.c 这个文件就是我们的C++代码了。LOCAL_SRC_FILES 需要编译的源代码文件列表,如果有多个,在每一个源文件后面用 “ \ ” 隔开


include $(BUILD_SHARED_LIBRARY)

编译动态链接库


下面是简单的HelloNDK.c

#include<string.h>#include<jni.h>jstring Java_com_example_ndkdemos_MainActivity_HelloNDK( JNIEnv* env,jobject thiz ){    //return (*env)->NewStringUTF(env, "Hello from JNI !");return (*env)->NewStringUTF(env,"HelloNDK");}

超简单的,返回一个string到Java层。

函数名要按照标准的格式。

Java  一定加上这个开头com_example_ndkdemos  包名,只不过用 _  代替了  .MainActivity     这个是Activity名HelloNDK   这个就是在Activity中注册的函数名了。


这里返回了 “HelloNDK” 这样一个字符串到Android层


下面看MainActivity.java了。主要代码就两行哈。

package com.example.ndkdemos;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.widget.TextView;public class MainActivity extends Activity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView=(TextView)findViewById(R.id.textView1);textView.setText(HelloNDK());}public native String  HelloNDK();@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}static{System.loadLibrary("HelloNDK");}}


要点:

1. public native String HelloNDK(); 这里注册了函数,用native表示这个函数在C++中实现。

2. 一定要记得加载动态链接库啊,而且只要填上名字就可以了,不要加上“.so”!

static

{
System.loadLibrary("HelloNDK");
}


好了,完毕!





更多相关文章

  1. 箭头函数的基础使用
  2. NPM 和webpack 的基础使用
  3. Python技巧匿名函数、回调函数和高阶函数
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. 读取android手机流量信息
  6. 浅析android通过jni控制service服务程序的简易流程
  7. android 使用html5作布局文件: webview跟javascript交互
  8. Android(安卓)多媒体扫描过程(Android(安卓)Media Scanner Proces
  9. android“设置”里的版本号

随机推荐

  1. android 下Excel操作
  2. android 判断网络是否可用,并调用系统设置
  3. Android(安卓)Wifi框架流程分析
  4. Android——分别获取导航栏、状态栏高度
  5. Android(安卓)配置 之 AndroidManifest.x
  6. Android输入法的显示与隐藏
  7. android 开发使用 kotlin 进行点击事件监
  8. Android(安卓)ImageView去掉周围的白边
  9. ubuntu 12.04 下安装android编译环境
  10. Android(安卓)Google应用移植时包依赖关