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 := -llog LOCAL_MODULE := HelloNDK LOCAL_SRC_FILES := HelloNDK.c include $(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"); }
函数名要按照标准的格式。
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; @Override protected 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(); @Override public 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");
}
好了,完毕!