博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
〖Linux〗Android NDK调用已编译好的C/C++动态连接库(so文件)
阅读量:6148 次
发布时间:2019-06-21

本文共 3193 字,大约阅读时间需要 10 分钟。

一、背景:假定已有应用程序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 
#include
#include
#include
/*----------------------------------------------------------------------------- * 从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 > 0) { pstr = (char*) malloc(size); memcpy(pstr, pbyte, size); } return pstr;}jstringJava_com_scue_zigbeeclient_ZigbeeActivity_getResultJni( JNIEnv* env, jobject thiz , jstring subdev, jstring ctrltype, jstring mod, jstring server){ int ret=0; int argc = 4; char *argv[4]; argv[0]=jstring_to_pchar(env, subdev); argv[1]=jstring_to_pchar(env, ctrltype); argv[2]=jstring_to_pchar(env, mod); argv[3]=jstring_to_pchar(env, server); ret = getresult(argc, argv); char cret[10]=""; sprintf(cret, "%d", ret); return (*env)->NewStringUTF(env, cret);}

  2. 编写Android.mk文件:

# Copyright (C) 2009 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-prebultLOCAL_SRC_FILES := libs/libzigbee.soinclude $(PREBUILT_SHARED_LIBRARY)include $(CLEAR_VARS)LOCAL_MODULE    := hello-jniLOCAL_SRC_FILES := hello-jni.cLOCAL_SHARED_LIBRARIES := zigbee-prebultinclude $(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文件:

转载地址:http://vhlya.baihongyu.com/

你可能感兴趣的文章
网站安全那些事
查看>>
清理prometheus指定key的数据
查看>>
html: Table合并行和列
查看>>
WP7开发学习笔记----1
查看>>
分布式文件系统FastDFS 集群安装
查看>>
怎么知道自己系统是32位,还是64位?
查看>>
前端,移动开发者,UI须懂: 不同设备的之间的尺寸
查看>>
让我们一起Go(四)
查看>>
信息防泄露:如何为企业数据设一道安全关卡?
查看>>
Linux 路由转发功能的开启
查看>>
linux监控cacti配置教程(6)
查看>>
jvm 内存分配
查看>>
从Storm和Spark 学习流式实时分布式计算的设计
查看>>
各大银行的收发标准
查看>>
Spring Cloud Finchley 正式发布,包含 4 个重大更新!
查看>>
Nginx + Tomcat + HTTPS 配置原来不需要在 Tomcat 上启用 SSL 支持
查看>>
我的友情链接
查看>>
应用多级缓存模式支撑海量读服务
查看>>
spring boot @ConditionalOnxxx相关注解总结
查看>>
Mysql内存参数优化
查看>>