说明:java调用本地C/C++的代码需要通过jni来实现。
准备工作:首先需要下载安装ndk,他负责创建so库同你的android代码打包成apk文件。高版本的ndk自带打包工具,所以不需要再安装cygwin了。
现在进行我们的第一个jni程序
新建一个android项目,新建一个类,取名叫myjni。
public class myjni {
static {
System.loadLibrary("hello-jni");//加载库 libtest.so
}
public static native int plus(int a, int b);//对应native层的Java_com_mylzc_jni_Jni_plus函数
public static native String getText(String name);//对应native层的Java_com_mylzc_jni_Jni_plus函数
}
该类负责本地C语言代码的声明,首先加载库,我们取名叫hello-jni(后面会创建),然后声明两个函数(用native修饰代表本地)。
plus函数将a与b相加,getText函数,显示字符串
主activity这么写:
public class MainActivity extends Activity {
TextView tv1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myjni jni=new myjni();
Log.v("debug",jni.plus(10, 20)+"");
tv1=(TextView)findViewById(R.id.my);
tv1.setText("gaga"+jni.plus(10, 20)+jni.getText("what"));
}
}
进入cmd,进入该项目根目录下输入javah -classpath bin/classes -d jni com.example.hellonkd1.myjni
执行完后会在项目根目录下出现一个jni文件夹,里面有com_example_hellondk1_myjni.h文件。
可以打开该文件看看
接下来我们将新建一个文件com_example_hello_ndk1_myjni.cpp,将.h文件复制到该文件内,将代码改为如下c代码。
#include <jni.h>
#include<stdio.h>
#include<string.h>
extern "C" {
jint Java_com_example_hellondk1_myjni_plus
(JNIEnv *, jclass, jint x, jint y) {
return x + y;//返回x+y的结果
}
JNIEXPORT jstring JNICALL Java_com_example_hellondk1_myjni_getText
(JNIEnv *env, jclass, jstring str) {
/*
//从jstring类型取得c语言环境下的char*类型
const char* name = env->GetStringUTFChars(str, 0);
//本地常量字符串
char* hello = "你好,";
//动态分配目标字符串空间
char* result = (char*)malloc((strlen(name) + strlen(hello) + 1)*sizeof(char));
memset(result,0,sizeof(result));
//字符串链接
strcat(result,hello);
strcat(result,name);
//释放jni分配的内存
env->ReleaseStringUTFChars(str,name);
*/
//生成返回值对象
//释放动态分配的内存
//free(result);
//
return env->NewStringUTF("hello world");
}
}
接下来需要编写Android.mk配置文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := com_example_hello_ndk_1_myjni.cpp
include $(BUILD_SHARED_LIBRARY)
名称为hello-jni就是我们之前加载的那个,源文件是刚才编的c文件com_example_hello_ndk1_myjni.cpp
新建Application.mk,内容如下
APP_ABI := all
all是让配置所有环境下so库。
至此大功告成,jni文件夹下有4个文件
还有最后一步,使用ndk自带的工具打包so库(该工具在ndk根目录,名为ndk-build)
进入cmd,进入该项目根目录,输入ndk-build,你会看有很多操作结果。
同时在libs文件夹下会生成很多.so文件
运行你的工程吧,是不是很简单呢?
ndk下载链接:点击打开链接
demo链接:点击打开链接