生成动态库so的方法|解决NDK r5b引…

本文详细介绍了两种生成Android动态库so文件的方法:在Android源码环境中生成和利用NDK r5b。同时,针对NDK引用静态库失效问题提出了解决方案,并讲解了在NDK Native代码中如何使用Android Log以及如何生成Java Native头文件。
摘要由CSDN通过智能技术生成

一、生成动态库so的方法有两种

1.在Android源码环境中生成so
(1)App由两部分组成:Native实现程序+应用程序+引用静态库,将实现程序拷贝至源码项目,编写Android.mk

(2)把需要引用的外部静态库拷贝至源码目录

  $HOME/android-2.1_r2/out/target/product/generic/obj/STATIC_LIBRARIES/添加静态库文件libDEC264_intermediates/libDEC264.a

(3)执行mm后,生成动态库 Install: out/target/product/generic/system/lib/libNetStartRecord.so

2.利用NDK生成so

(1)配置NDK环境,下载android-ndk-r5b,设置PATH环境变量。

(2)在elipse里新建Android项目,在项目内新建jni文件夹,并在文件夹中添加Nactive Code文件和Android.mk文件。

(3)使用终端进入改项目,执行$NDK/ndk-build命令,在项目位置生成obj和libs文件夹。so库文件在libs文件夹里生成了


二、解决NDK r5b引用静态库失效的问题

如果这个外部的静态库.a不是由NDK生成,那在Android.mk里面,就应该用LOCAL_LDLIBS来引用该静态库。如下:

LOCAL_LDLIBS := libvoiceengine.a

三、在NDK的Nactive代码中使用Android Log的方法

1.在mk文件加入:LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
2.在cpp文件加入:
#include <android/log.h>
#define LOGI(...) __android_log_print(ANDROID_LOG_DEBUG, "keymatch", __VA_ARGS__)
3.使用:LOGI("input params Challenge");

四、生成Native java头文件

(1)声明Java Native接口。(定义Java Native接口可以在Android项目的主类里声明,也可以通过使用独立的类来声明。)

static
{
    System.loadLibrary("libtmpcPlayerDemo");
}
public native void start_netiq()
  1. package com.enleo.tmpcPlayer4Droid;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.Button;  
  8.   
  9. public class tmpcPlayer4Droid extends Activity implements OnClickListener  
  10.     private final static String TAG "tmpcPlayer4Droid";  
  11.       
  12.     // native java  
  13.     private Button startNetIQBtn;  
  14.     static  
  15.      
  16.         System.loadLibrary("libtmpcPlayerDemo");  
  17.      
  18.     public native void start_netiq();  
  19.       
  20.       
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState)  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.         startNetIQBtn (Button)findViewById(R.id.startNetIQ);  
  26.         startNetIQBtn.setOnClickListener(this);  
  27.      
  28.     public void onClick(View arg0)  
  29.         // TODO Auto-generated method stub  
  30.         switch (arg0.getId())    
  31.         case R.id.startNetIQ:  
  32.             start_netiq();  
  33.             break;  
  34.         default:  
  35.             break;  
  36.           
  37.      
  38.       
  39.  
(2)编译该Android项目,会在bin目录下(<workspace>/tmpcPlayer4Droid/ bin/com/enleo/tmpcPlayer4Droid)生成tmpcPlayer4Droid.class文件。定位到包文件夹的同级目录下,运行javah注意:“.”号和包名。

javah -classpath . -jni com.enleo.tmpcPlayer4Droid.tmpcPlayer4Droid

运行成功后,会生成com_enleo_tmpcPlayer4Droid_tmpcPlayer4Droid.h文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值