java 层受限于虚拟机。有些操作可能需要用ndk来实现。下面我简单的写一个demo . 这个demo主要作用是 在C层提供一个方法 add(int i , int i ) . 实现两个数的相加。
一。 在Java层写一个类 ,这个类包含 native方法。 如下
package com.test.ndk_hello;
public class NdkTools {
public native int add(int a , int b) ;
static {
System.loadLibrary("ndktools");
}
}
其中 static 中的语句 主要是加载 ndktools 这个库。 ndktools 是我们下面要实现的库名字。
二 。 编写ndk层 ,实现 add 函数。
1 . add.c
#include <jni.h>
jint Java_com_test_ndk_NdkTools_add(JNIEnv *env, jobject obj, jint a, jint b)
{
return a+b ;
}
注意这个方法名 。它其实是 Java_ 加上 包名 在加上类名方法名。 可以自己直接按照这种规则写。也可以先用javah 先得到头文件。具体做法如下
C:/XX/bin/:
javah -classpath . -jni com.test.ndk.NdkTools然后 就会再classes目录下得到
这个头文件中就会有具体的方法名。
ndk的 makefile
LOCAL_PATH := $(call my-dir)
MY_USE_SPEEX := 1
include $(CLEAR_VARS)
ANDROID_DEBUG :=1
#Add target arm version
ifeq ($(TARGET_ARCH_ABI),armeabi)
MY_PJSIP_FLAGS := $(BASE_PJSIP_FLAGS) -DPJ_HAS_FLOATING_POINT=0
else
MY_PJSIP_FLAGS := $(BASE_PJSIP_FLAGS) -DPJ_HAS_FLOATING_POINT=1
endif
LOCAL_CFLAGS := $(MY_PJSIP_FLAGS)
APP_PLATFORM := android-9
LOCAL_MODULE := ndktools
LOCAL_SRC_FILES := add.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)
然后运行ndk-build 就会生成 ndktools.so .
然后把这个.so copy到工程目录lib中 就可以用了。