实现在Android上jni编程,Android的c程序编译需放在Android2.0目录里利用Android的makefile进行编译。不像java下jni一样可以自己在其他地方编译然后在java程序中调用就可以了。
一:创建调用jni方法的android项目
1.在Eclipse下创建Android项目,如Jni_android,src目录下创建T1.java。
T1.java文件
-----------------------------
package org.aka;
import android.app.Activity;
import android.os.Bundle;
public class T1 extends Activity {
??? /** Called when the activity is first created. */
????
??? public native void display();
??? static {
??? ??? System.loadLibrary("goodluck");
??? }
????
??? @Override
??? public void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.main);
??????? display();
??? }
}
-----------------------------
二:实现libgoodluck.so库
1.实现libgoodluck.so库,供T1调用,libgoodluck库中实现了dispaly方法。
2.jni实现时需知道,display在java中文件名,可通过javah获取。
方法:在终端里进入Jni_android所在的目录,如:我的是/home/xwp/workspace/Jni_android,进入生成bin文件的目录/home/xwp/workspace/Jni_android/bin,执行"javah -classpath . -jni org.aka.T1"(org.aka是包名)。生成了org_aka_T1.h文件。
org_aka_T1.h文件
-----------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class org_aka_T1 */
#ifndef _Included_org_aka_T1
#define _Included_org_aka_T1
#ifdef __cplusplus
extern "C" {
#endif
/*
?* Class:???? org_aka_T1
?* Method:??? display
?* Signature: ()V
?*/
JNIEXPORT void JNICALL Java_org_aka_T1_display
? (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
-----------------------------
2.创建goodluck.c文件,根据org_aka_T1.h知道,jni要实现的C程序名为“JNIEXPORT void JNICALL Java_org_aka_T1_display(JNIEnv *, jobject)”,(实现具体方法时需添加参数,JNIEnv *env, jobject jobj)。
3.goodluck.c文件
-----------------------------
#include <jni.h>
#include <stdio.h>
#define LOG_TAG "Testlib"
#undef LOG
#include <utils/Log.h>
JNIEXPORT void JNICALL Java_org_aka_T1_display(JNIEnv *env, jobject jobj)
{
??? LOGD("hello ,goodluck/n");
}
-----------------------------
4.goodluck.c需放到Android2.0目录下,利用Android提供的专用Android.mk进行编译,具体方法:
(1) cd <YourAndroid2.0目录>/development/
(2) mkdir goodluck
(3) 拷贝goodluck.c 到 goodluck目录下
(4) 创建Android.mk文件,可从其他目录下拷贝,然后修改为
Android.mk文件
-----------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= goodluck.c
LOCAL_C_INCLUDES:=$(JNI_H_INCLUDE)
LOCAL_SHARED_LIBRARIES:=libutils
LOCAL_PRELINK_MODULE:=false
LOCAL_MODULE := libgoodluck
include $(BUILD_SHARED_LIBRARY)
-----------------------------
(5) cd <YourAndroid2.0目录>,执行make libgoodluck,屏幕输出:
-----------------------------
============================================
PLATFORM_VERSION_CODENAME=AOSP
PLATFORM_VERSION=AOSP
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=MASTER
============================================
/bin/bash: 第 0 行: cd: development/tools/layoutopt/app/src/resources: 没有那个文件或目录
Install: out/host/linux-x86/bin/apriori
Install: out/host/linux-x86/bin/soslim
target Non-prelinked: libgoodluck (out/target/product/generic/symbols/system/lib/libgoodluck.so)
Install: out/target/product/generic/system/lib/libdl.so
Install: out/target/product/generic/system/lib/libc.so
Install: out/target/product/generic/system/lib/libstdc++.so
Install: out/target/product/generic/system/lib/libm.so
Install: out/target/product/generic/system/lib/liblog.so
Install: out/target/product/generic/system/lib/libz.so
Install: out/target/product/generic/system/lib/libcutils.so
Install: out/target/product/generic/system/lib/libutils.so
Install: out/target/product/generic/system/lib/libgoodluck.so
-----------------------------
(6) 生成的libgoodluck.so在 <YourAndroid2.0目录>/out/target/product/generic/system/lib/libgoodluck.so。
5.启动Android虚拟机,把libgoodluck.so拷贝到虚拟机/system/lib目录下,刚启动的虚拟机是不能对/system/lib进行写操作的,并且虚拟机中/system分区没有可使用空间。方法:
(1) 在终端下运行adb remount,如找不到adb命令,在~/.bashrc 中添加“export PATH=$PATH:/home/xwp/soft/linux_android/android-sdk-linux_86/tools”保存并重启终端。
(2) 释放虚拟机中/system分区空间,可删除/system/app/下用不到的apk文件,我删除的Camera.apk,腾出了部分空间。
(3) 上传libgoodluck.so到虚拟机/system/lib,进入到out/target/product/generic/system/lib/下,运行"adb push libgoodluck.so /system/lib"
6.在Eclipse中运行Jni_android项目,打开logcat,观察。出现了“Testlib??? hello,goodluck”这行log,表示JNI调用成功。
详细解决方案
Android中兑现JNI调用笔记
热度:88 发布时间:2016-05-01 20:05:46.0
相关解决方案
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法