一、背景:假定已有应用程序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

〖Linux〗Android NDK调用已编译好的C/C++动态连接库(so文件)的更多相关文章

  1. C编译: 动态连接库 (.so文件)(转摘)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现算法和数据 ...

  2. C编译: 动态连接库 (.so文件)

    转自:http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现 ...

  3. android ndk调用OpenGL 实现纹理贴图Texture

    android ndk调用OpenGL 实现纹理贴图Texture 时间 2014-06-25 05:24:39  CSDN博客 原文  http://blog.csdn.net/chrisfxs/a ...

  4. Linux下的动态连接库及其实现机制

    Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术 ...

  5. Linux 静态链接库和动态连接库

    (0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux ...

  6. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  7. VS2013 生成sqlite3动态连接库及sqlite3.dll的调用

    一,生成sqlite3动态连接库1,去sqlite官网上下载最近的sqlite源码包,解压后得到四个文件:shell.c,sqlite3.c,sqlite3.h,sqlite3ext.h此处还需要sq ...

  8. 在eclipse中配置android ndk的自动编译环境builders

    无论linux还是mac在jni目录中直接运行  ndk-build 就可以生成 lib目录及所需要的 so文件: windows 装上lnx模拟器也是一样: 每次修改完 c++代码, 都要运行一下 ...

  9. Ubuntu系统下实现Android工程调用独立编译的C++程序和GMP、PBC库

    目的: 实现使用C++编写代码供Android工程调用.C++代码中可以使用STL库,也可以使用常用的由源码编译生成的库,如PBC.因为PBC是基于GMP库的,所以这里只记录了GMP和PBC库的编译安 ...

随机推荐

  1. MySQL运维开发相关的所有工具

    http://www.ruzuojun.com/topic/592.html   Percona Toolkit 安装使用 http://cenalulu.github.io/mysql/mysql- ...

  2. ob_start()、ob_end_flush和ob_end_clean()多级缓冲

    ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制.当成一对出现理解起来就没什么问题,但是当他们两个各自出现次数增加时,就比较难理解了. <?php ...

  3. Apple Developer Registration and DUNS Number Not Accepted

    Now that I have my Mac and app source code. I’m ready to start working on my first app. The next ste ...

  4. Unity3D中的弹道和移动目标提前量计算

    弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的数学.网上这方面的资料还真不多,而且都是写的含含糊糊.抽空总结一下自己的方法. 讨论的前提是,假设目标 ...

  5. arcgis python 创建 SQLite 数据库

    # -*- ################# """ Tool name: Create SQLite Database Source: CreateSQLiteDat ...

  6. 【java】将字符串的首字母大写

    工具方法: public static void main(String[] args) { System.out.println(upperCaseFirst("barer")) ...

  7. .NET:CLR via C# A Brief Look at Metadata

    基础知识 A managed PE file has four main parts: the PE32(+) header, the CLR header, the metadata, and th ...

  8. 我所遭遇过的游戏中间件---Redux

    我所遭遇过的游戏中间件---Redux 一.关于Redux Substance Redux 是一款纹理处理软件加中间件,专门用于纹理生成和压缩.具其用户指南介绍,它能够对纹理集进行优化,可以将现有压缩 ...

  9. OTL翻译(8) -- otl_long_string/otl_long_unicode_string类

    otl_long_string/olt_long_unicode_string 这两个类主要用来处理大对象数据.从OTL4.0版本开始,otl_long_string还可以处理任何类型的RAW/BIA ...

  10. libjson 编译和使用 - 2. 配置使用lib文件

    以下转自:http://blog.csdn.net/laogong5i0/article/details/8223448 1. 在之前的libjson所在的解决方案里新建一个控制台应用程序,叫Test ...