一、背景:假定已有应用程序zigbeeclient.cpp,内容如下:

...
extern "C" {
int getresult(int argc, char **argv);
} int getresult(int argc, char **argv)
{
...
}

  这个文件生成一个动态链接库libzigbee.so

$(CXX) $(CXXFLAGS) $(MYCLIENTCFLAGS) $(LDFALGS) $(INCLUDE) -fPIC -llog -shared $^ -o libzigbee.so

二、期望:能在Android任意一个的NDK应用程序中,可调用此库中的getresult()函数

  1. 编写NDK的C语言文件zigbeeclient.c,内容如下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <jni.h> /*-----------------------------------------------------------------------------
* 从libzigbee.so中调用进来的函数
*-----------------------------------------------------------------------------*/
int getresult(int argc, char **argv); /*-----------------------------------------------------------------------------
* String to char*
*-----------------------------------------------------------------------------*/
char* jstring_to_pchar(JNIEnv* env, jstring str)
{
char* pstr = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String");
jstring strencode = (*env)->NewStringUTF(env, "utf-8");
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",
"(Ljava/lang/String;)[B");
jbyteArray byteArray = (jbyteArray)(
(*env)->CallObjectMethod(env, str, mid, strencode));
jsize size = (*env)->GetArrayLength(env, byteArray);
jbyte* pbyte = (*env)->GetByteArrayElements(env, byteArray, JNI_FALSE);
if (size > )
{
pstr = (char*) malloc(size);
memcpy(pstr, pbyte, size);
}
return pstr;
} jstring
Java_com_scue_zigbeeclient_ZigbeeActivity_getResultJni( JNIEnv* env, jobject thiz ,
jstring subdev, jstring ctrltype, jstring mod, jstring server)
{
int ret=;
int argc = ;
char *argv[];
argv[]=jstring_to_pchar(env, subdev);
argv[]=jstring_to_pchar(env, ctrltype);
argv[]=jstring_to_pchar(env, mod);
argv[]=jstring_to_pchar(env, server);
ret = getresult(argc, argv);
char cret[]="";
sprintf(cret, "%d", ret);
return (*env)->NewStringUTF(env, cret);
}

  2. 编写Android.mk文件:

# Copyright (C)  The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE := zigbee-prebult
LOCAL_SRC_FILES := libs/libzigbee.so
include $(PREBUILT_SHARED_LIBRARY) include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SHARED_LIBRARIES := zigbee-prebult
include $(BUILD_SHARED_LIBRARY)

  3. 在Java程序文件中,load动态库的顺序有讲究(后一个依赖于前一个):

public native String  getResultJni(String subdev, String ctrltype, String mod, String server);
static {
System.loadLibrary("zigbee");
System.loadLibrary("zigbeeclient");
}

  4. 其他的细节可以下载我打包好的tar文件:Android_NDK_Extra_So.tgz

最新文章

  1. s:if 判断
  2. 你的USB设备还安全吗?USB的安全性已从根本上被打破!
  3. C#字符串(截取)
  4. Codeforce 546D
  5. sql日期格式化
  6. C语言 百人拉百灯问题
  7. MySQL purge log简单吗
  8. javascript的navigator对象
  9. Java并发编程之ThreadLocal类
  10. Truncate Delete 用法
  11. CSS3/jQuery自定义弹出窗口
  12. tableviewcell 中使用autolayout自适应高度
  13. 关于EF中直接执行sql语句的参数化问题
  14. JDBC连接MySQL数据库基础
  15. java float double bigdecimal
  16. NPOI 通过excel模板写入数据并导出
  17. Redis学习系列二之.Net开发环境搭建及基础数据结构String字符串
  18. React从0到1
  19. 冒泡排序算法的 python 实现与 C 的比较
  20. python3.7 安装pyopengl,环境搭建

热门文章

  1. WP8.1 VS iOS VS Android全方面大比拼
  2. 配置NGINX支持中文URL 中文文件名称或文件夹404无法訪问的解决方法
  3. 将 MRC 项目转换为 ARC 项目
  4. struts2 select标签
  5. VMware虚拟机的三种联网方法及原理
  6. bat薪酬
  7. 使用 kubeadm 搭建 kubernetes1.10 集群
  8. C++:友元运算符重载函数
  9. crtmpserver实现防盗流和流推送验证 之二
  10. WCF 添加 RESTful 支持,适用于 IIS、Winform、cmd 宿主