当前位置:首页 » 安卓系统 » androidjnicc

androidjnicc

发布时间: 2022-11-20 14:03:37

⑴ android 从jobject、jclass获取类名(API>19)(一)

用途在Art中Hook JNI相关函数。存在jobject jclass 参数时需要得到具体的类名。

在Art虚拟机中:

jobject在内存中表现为:art::mirror::Object,可从GetObjectClass方法中分析得到(art/runtime/jni_internal.cc)

jclass在内存中表现为:art::mirror::Class,可从GetSuperclass方法中分析得到(art/runtime/jni_internal.cc)

获取类名重点在art::mirror::Class类中,通过分析Class 类发现在art/runtime/mirror/class-inl.h头文件中存在一个获取类名的方法

上述方法存在两个问题:

综上所述,GetName不适合获取类名

在dalvik虚拟机中存在一个方法dvmDecodeIndirectRef,可以将jobject、jclass转为对应的内存结构指针。

经过查找发现在/art/runtime/thread.cc中存在一个方法DecodeJObject可以将jobject、jclass转换为对应的内存结构指针

DecodeJObject是Thread类的一个方法,通过dlsym拿到方法地址后,其表现形式如下:

第一个参数表示this即当前对象。可以通过如下方法获取Thread对象的实例

同时发现/art/runtime/mirror/class.cc中存在GetDescriptor方法可以获取art::mirror::Class的类名

GetDescriptor是Class类的一个方法,通过dlsym拿到方法地址后,其表现形式如下:

第一个参数表示this即当前对象。可以通过DecodeJObject获取Class对象的实例,

在最终可以整理得到获取jclass类名的方法:

获取jobject方法就简单一点其内存结构可以精简如下:

其中klass就是Class对象的指针,最终整理后的方法如下:

上述方法太过于麻烦,后面给出一个简单的方法,可以模拟dalvik解析dex拿到类名。不早了,睡了

⑵ 如何制定android交叉编译工具链

经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86 PC机的编译工具,可以让你在PC机上编译出目标平台(例如ARM)可识别的二进制文件。Android平台也提供了这样的交叉编译工具链,就放在Android的NDK开发包的toolchains目录下,因此,我们的Makefile文件中,只需给出相应的编译工具即可。
废话就先说到这,直接上例子,我们目标是把下面这个math.c文件编译成一个静态库文件:
#include <stdio.h>
int add( int a , int b ) {
return a+b;
}
你需要编写一个Makefile文件,这里假设你的Android ndk被安装在 /opt/android/ndk 目录下,当然,你可以根据自己的实际情况修改Makefile中相关路径的定义,Makefile文件示例如下:
# Makefile Written by ticktick
# Show how to cross-compile c/c++ code for android platform
.PHONY: clean
NDKROOT=/opt/android/ndk
PLATFORM=$(NDKROOT)/platforms/android-14/arch-arm
CROSS_COMPILE=$(NDKROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
CFLAGS = -I$(PWD) -I$(PLATFORM)/usr/include -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
LDFLAGS =
TARGET = libmath.a
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
all: $(OBJS)
$(AR) -rc $(TARGET) $(OBJS)
clean:
rm -f *.o *.a *.so
这里不讲Makefile文件的基本原理,只说明一下针对Android环境的Makefile文件编写的注意事项。
(1) CROSS_COMPILE
必须正确给出Android NDK编译工具链的路径,当在目录中执行make命令的时候,编译系统会根据 CROSS_COMPILE 前缀寻找对应的编译命令。
(2) -I$(PLATFORM)/usr/include
由于Android平台没有使用传统的c语言库libc,而是自己编写了一套更加高效更适合嵌入式平台的c语言库,所以系统头文件目录不能再使用默认的路径,必须直到Android平台的头文件目录
(3) -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
这些参数的意义网上基本上都有介绍,我就不一一解释了,并不都是必须添加的,但比较常用。
编译方法:
写好makefile文件,并且保存之后,就可以直接在当前目录下执行make命令,编译完成后,当前目录下会生成 libmath.a ,即可直接拿到Android的jni工程中和使用了。

⑶ 如何在Android上使用plugin-x

如何在ANDROID上使用PLUGIN-X
需要的环境
python 2.7 http://www.python.org
Ant http://ant.apache.org
Cygwin (如果使用windows)
编译插件
首先,我们需要编译libPluginProtocal和所有我们需要的插件。在frameworks/js-bindings/cocos2d-x/plugin/tools/config.sh文件中,删掉ALL_PLUGINS里我们不需要的插件。然后在终端(windows上需要使用cygwin)运行frameworks/js-bindings/cocos2d-x/plugin/tools/publish.sh脚本,它会要求输入一些环境变量的配置。

在windows上,我们需要输入Linux风格的路径。例如,你应该输入C:/adt-bundle-windows/sdk,而不是C:\adt-bundle-windows\sdk。
所有编译完成以后,会在plugin-x的根目录下生成一个publish文件夹。如果你的publish文件夹看起来和下图一样,说明你的编译成功了!

修改你的游戏工程
我们需要做哪些修改?
修改.mk文件(Android.mk & Application.mk)来链接plugin-x生成的C++静态库。
修改android工程配置链接plugin-x和第三方SDK库的jar包。
修改AndroidManifest.xml,增加一些插件需要的权限。
对一些特定的插件,还要添加外部依赖项目和资源。
增加一些初始化代码。
使用脚本工具
如果你是一个android开发的专家,你完全可以自己完成这些修改。这很容易,不是吗?不,一点也不!幸运的是我们有一个脚本工具来完成大部分的修改。在你的终端(windows上使用cygwin)里运行frameworks/js-bindings/cocos2d-x/plugin/tools/gameDevGuide.sh脚本,它会有一个python写的UI界面,看起来像这样:

输入你的工程路径,注意不能含有空格,然后点击'Next'。

选择你需要的插件,然后点击'Finish',程序会自动完成需要做的修改。
一些手工修改
把publish文件夹路径添加到NDK_MODULE_PATH环境变量,例如: NDK_MODULE_PATH=${PLUGIN_ROOT}/publish。一个简单的方法就是在工程的build-cfg.json文件中,吧publish文件夹路径添加到ndk_mole_path数组中。
在build-cfg.json文件的_resources中,添加:
{
"from": "../../../../frameworks/js-bindings/cocos2d-x/plugin/jsbindings/script",
"to": ""
}

在AppDelegate.cpp中添加:
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "jsb_cocos2dx_pluginx_auto.hpp"
#include "jsb_pluginx_extension_registration.h"
#endif

bool AppDelegate::applicationDidFinishLaunching()
{
//...
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
sc->addRegisterCallback(register_all_pluginx_protocols);
sc->addRegisterCallback(register_pluginx_js_extensions);
#endif
//...
}

在jni/main.cpp中添加代码:
#include "PluginJniHelper.h"
void cocos_android_app_init (JNIEnv* env, jobject thiz) {
LOGD("cocos_android_app_init");
AppDelegate *pAppDelegate = new AppDelegate();
javaVM* vm;
env->GetJavaVM(&vm);
PluginJniHelper::setJavaVM(vm);
}

在AppActivity.java中添加代码:
import org.cocos2dx.plugin.PluginWrapper;

public class AppActivity extends Cocos2dxActivity {
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);

PluginWrapper.init(this);
PluginWrapper.setGLSurfaceView(glSurfaceView);
return glSurfaceView;
}
}

在js代码中使用plugin-x
装载和卸载插件
所有的插件都是使用PluginManager管理,通过插件名来装载/卸载,例如:
// load plugin AnalyticsFlurry
var g_pAnalytics = plugin.PluginManager.getInstance().loadPlugin("AnalyticsFlurry");

// unload plugin AnalyticsFlurry
plugin.PluginManager.getInstance().unloadPlugin("AnalyticsFlurry");

使用插件功能
你可以通过方法名和参数直接调用插件中定义的方法,例如:
// enable the debug mode
g_pAnalytics.setDebugMode(true);
g_pAnalytics.startSession(s_strAppKey);
g_pAnalytics.setCaptureUncaughtException(true);

// call function with params
g_pAnalytics.callFuncWithParam("setUserId", new plugin.PluginParam(plugin.PluginParam.ParamType.TypeString, "123456"));

⑷ android jni abifilters为什么没产生文件

android studio 中简单的jni开发
Let’s Go!!!
准备工作不再需要什么cgwin来编译ndk(太特么操蛋了),现在只需要你下载一下NDK的库就ok了,然后你也可以去离线下载http://www.androiddevtools.cn最新版,这里吐槽一下android studio对NDK的支持还有待提高。
效果
看下今天的效果:(安卓jni获取 apk的包名及签名信息)

必须的步骤
1.配置你的ndk路径(local.properties)
ndk.dir=E:\Android\sdk\android-ndk-r11b-windows-x86_64\android-ndk-r11b
2.grale配置使用ndk(gradle.properties)
android.useDeprecatedNdk=true
3.在mole下的build.gradle添加ndk以及jni生成目录
ndk{
moleName “JNI_ANDROID”
abiFilters “armeabi”, “armeabi-v7a”, “x86” //输出指定三种abi体系结构下的so库,目前可有可无。
}
sourceSets.main{
jniLibs.srcDirs = [‘libs’]
}
准备工作做好了开始写代码:(jni实现获取应用的包名和签名信息)
步骤1:先写要实现本地方法的类,及加载库(JNI_ANDROID也就是ndk 里面配的moleName)
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

<code class="hljs java">package com.losileeya.getapkinfo;

/**
* User: Losileeya ([email protected])
* Date: 2016-07-16
* Time: 11:09
* 类描述:
*
* @version :
*/
public class JNIUtils {
/**
* 获取应用的签名
* @param o
* @return
*/
public static native String getSignature(Object o);

/**
* 获取应用的包名
* @param o
* @return
*/
public static native String getPackname(Object o);

/**
* 加载so库或jni库
*/
static {
System.loadLibrary("JNI_ANDROID");
}
}</code>

注意我们 的加载c方法都加了native关键字,然后要使用jni下的c/c++文件就必须使用System.loadLibrary()。
步骤2:使用javah命令生成.h(头文件)
javah -jni com.losileeya.getapkinfo.JNIUtils
执行完之后你可以在mole下文件夹app\build\intermediates\classes\debug下看见生成的 .h头文件为:
com_losileeya_getapkinfo_JNIUtils.h
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<code class="hljs vala">/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_losileeya_getapkinfo_JNIUtils */

#ifndef _Included_com_losileeya_getapkinfo_JNIUtils
#define _Included_com_losileeya_getapkinfo_JNIUtils
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getPackname(JNIEnv *, jobject, jobject);
JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getSignature(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif</jni.h></code>

在工程的main目录下新建一个名字为jni的目录,然后将刚才的.h文件剪切过来,当然文件名字是可以修改的
步骤3:根据.h文件生成相应的c/cpp文件
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

<code class="hljs scala">//
// Created by Administrator on 2016/7/16.
//
#include <stdio.h>
#include <jni.h>
#include <stdlib.h>
#include "appinfo.h"
JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getPackname(JNIEnv *env, jobject clazz, jobject obj)
{
jclass native_class = env->GetObjectClass(obj);
jmethodID mId = env->GetMethodID(native_class, "getPackageName", "()Ljava/lang/String;");
jstring packName = static_cast<jstring>(env->CallObjectMethod(obj, mId));
return packName;
}

JNIEXPORT jstring JNICALL Java_com_losileeya_getapkinfo_JNIUtils_getSignature(JNIEnv *env, jobject clazz, jobject obj)
{
jclass native_class = env->GetObjectClass(obj);
jmethodID pm_id = env->GetMethodID(native_class, "getPackageManager", "()Landroid/content/pm/PackageManager;");
jobject pm_obj = env->CallObjectMethod(obj, pm_id);
jclass pm_clazz = env->GetObjectClass(pm_obj);
// 得到 getPackageInfo 方法的 ID
jmethodID package_info_id = env->GetMethodID(pm_clazz, "getPackageInfo","(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;");
jstring pkg_str = Java_com_losileeya_getapkinfo_JNIUtils_getPackname(env, clazz, obj);
// 获得应用包的信息
jobject pi_obj = env->CallObjectMethod(pm_obj, package_info_id, pkg_str, 64);
// 获得 PackageInfo 类
jclass pi_clazz = env->GetObjectClass(pi_obj);
// 获得签名数组属性的 ID
jfieldID signatures_fieldId = env->GetFieldID(pi_clazz, "signatures", "[Landroid/content/pm/Signature;");
jobject signatures_obj = env->GetObjectField(pi_obj, signatures_fieldId);
jobjectArray signaturesArray = (jobjectArray)signatures_obj;
jsize size = env->GetArrayLength(signaturesArray);
jobject signature_obj = env->GetObjectArrayElement(signaturesArray, 0);
jclass signature_clazz = env->GetObjectClass(signature_obj);
jmethodID string_id = env->GetMethodID(signature_clazz, "toCharsString", "()Ljava/lang/String;");
jstring str = static_cast<jstring>(env->CallObjectMethod(signature_obj, string_id));
char *c_msg = (char*)env->GetStringUTFChars(str,0);

return str;
}</jstring></jstring></stdlib.h></jni.h></stdio.h></code>

注意:要使用前得先声明,方法名直接从h文件考过来就好了,studio目前还是很操蛋的,对于jni的支持还是不很好。
步骤4:给项目添加Android.mk和Application.mk
此步骤显然也是不必要的,如果你需要生成so库添加一下也好,为什么不呢考过去改一下就好了,如果你不写这2文件也是没有问题的,因为debug下也是有这些so库的。
好吧,勉强看一下这2货:
Android.mk
?

1
2
3
4
5

<code class="hljs ruby">LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNI_ANDROID
LOCAL_SRC_FILES =: appinfo.cpp
include $(BUILD_SHARED_LIBRARY)</code>

Application.mk
?

1
2

<code class="hljs makefile">APP_MODULES := JNI_ANDROID
APP_ABI := all</code>

android studio下External Tools的高级配置NDK一键javah,ndk生成so库
eclipse开发ndk的时候你可能就配置过javah,所以android studio也可以配置,是不是很兴奋:
Settings—>Tools—->External Tools就可以配置我们的终端命令了,别急一个一个来:
javah -jni 命令的配置(一键生成h文件)

我们先来看参数的配置:
1.Program:JDKPath\bin\javah.exe 这里配置的是javah.exe的路径(基本一致)
2.Parametes: -classpath . -jni -d MoleFileDir/src/main/jni FileClass这里指的是定位在Mole的jni文件你指定的文件执行jni指令<㖞�"/kf/ware/vc/" target="_blank" class="keylink">++IpDQo8cD48aW1nIGFsdD0="" src="/uploadfile/Collfiles/20160718/201607181017581505.png" title="\" />
我们同样来看参数的配置:
1.Program:E:\Android\sdk\android-ndk-r11b-windows-x86_64\android-ndk-r11b\ndk-build.cmd 这里配置的是ndk下的ndk-build.cmd的路径(自己去找下)
2.Working:MoleFileDir\src\main\
javap-s(此命令用于c掉java方法时方法的签名)

我们同样来看参数的配置:
1.Program:JDKPath\bin\javap.exe 这里配置的是javap.exe的路径(基本一致)
2.Parametes: -classpathMoleFileDir/build/intermediates/classes/debug -s FileClass 这里指的是定位到build的debug目录下执行 javap -s class文件
3.Working:MoleFileDir
这里介绍最常用的3个命令,对你的帮助应该还是很大的来看一下怎么使用:
javah -jni的使用:选中native文件—>右键—>External Tools—>javah -jni
效果如下:

是不是自动生成了包名.类名的.h文件。
ndk-build的使用:选中jni文件—>右键—>External Tools—>ndk-build
效果如下:

是不是一键生成了7种so库,你还想去debug目录下面去找吗
javap-s的使用:选中native文件—>右键—>External Tools—>javap-s
效果如下:

看见了每个方法下的descriptor属性的值就是你所要的方法签名。
3种一键生成的命令讲完了,以后你用到了什么命令都可以这样设置,是不是很给力。

⑸ 如何用Android NDK编译FFmpeg

首先创建一个标准的Android项目vPlayer
android create project -n vPlayer -t 8 -p vPlayer -k me.abitno.vplayer -a PlayerView

然后在vPlayer目录里
mkdir jni && cd jni
wget htt p:/ /ffmpe g.o rg/releases/ffmpeg-0.6.t ar.bz2
tar xf ffmpeg-0.6.tar.bz2 && mv ffmpeg-0.6 ffmpeg && cd ffmpeg

在ffmpeg下新建一个config.sh,内容如下,注意把PREBUILT和PLATFORM设置正确。另外里面有些参数你也可以自行调整,我主要是为了配置一个播放器而这样设置的。
#!/bin/bash

PREBUILT=/home/abitno/Android/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0
PLATFORM=/home/abitno/Android/android-ndk-r4/build/platforms/android-8/arch-arm

./configure --target-os=linux \
--arch=arm \
--enable-version3 \
--enable-gpl \
--enable-nonfree \
--disable-stripping \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffserver \
--disable-ffprobe \
--disable-encoders \
--disable-muxers \
--disable-devices \
--disable-protocols \
--enable-protocol=file \
--enable-avfilter \
--disable-network \
--disable-mpegaudio-hp \
--disable-avdevice \
--enable-cross-compile \
--cc=$PREBUILT/bin/arm-eabi-gcc \
--cross-prefix=$PREBUILT/bin/arm-eabi- \
--nm=$PREBUILT/bin/arm-eabi-nm \
--extra-cflags="-fPIC -DANDROID" \
--disable-asm \
--enable-neon \
--enable-armv5te \
--extra-ldflags="-Wl,-T,$PREBUILT/arm-eabi/lib/ldscripts/armelf.x -Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtbegin.o $PREBUILT/lib/gcc/arm-eabi/4.4.0/crtend.o -lc -lm -ldl"

运行config.sh开始configure
chmod +x config.sh
./config.sh

configure完成后,编辑刚刚生成的config.h,找到这句
#define restrict restrict

Android的GCC不支持restrict关键字,于是修改成下面这样
#define restrict

编辑libavutil/libm.h,把其中的static方法都删除。
分别修改libavcodec、libavfilter、libavformat、libavutil、libpostproc和libswscale下的Makefile,把下面两句删除
include $(SUBDIR)../subdir.mak
include $(SUBDIR)../config.mak

在ffmpeg下添加一个文件av.mk,内容如下
# LOCAL_PATH is one of libavutil, libavcodec, libavformat, or libswscale

#include $(LOCAL_PATH)/../config-$(TARGET_ARCH).mak
include $(LOCAL_PATH)/../config.mak

OBJS :=
OBJS-yes :=
MMX-OBJS-yes :=
include $(LOCAL_PATH)/Makefile

# collect objects
OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes)
OBJS += $(OBJS-yes)

FFNAME := lib$(NAME)
FFLIBS := $(foreach,NAME,$(FFLIBS),lib$(NAME))
FFCFLAGS = -DHAVE_AV_CONFIG_H -Wno-sign-compare -Wno-switch -Wno-pointer-sign
FFCFLAGS += -DTARGET_CONFIG=\"config-$(TARGET_ARCH).h\"

ALL_S_FILES := $(wildcard $(LOCAL_PATH)/$(TARGET_ARCH)/*.S)
ALL_S_FILES := $(addprefix $(TARGET_ARCH)/, $(notdir $(ALL_S_FILES)))

ifneq ($(ALL_S_FILES),)
ALL_S_OBJS := $(patsubst %.S,%.o,$(ALL_S_FILES))
C_OBJS := $(filter-out $(ALL_S_OBJS),$(OBJS))
S_OBJS := $(filter $(ALL_S_OBJS),$(OBJS))
else
C_OBJS := $(OBJS)
S_OBJS :=
endif

C_FILES := $(patsubst %.o,%.c,$(C_OBJS))
S_FILES := $(patsubst %.o,%.S,$(S_OBJS))

FFFILES := $(sort $(S_FILES)) $(sort $(C_FILES))

接下来要添加一系列的Android.mk,在jni根目录下的内容如下
include $(all-subdir-makefiles)

在ffmpeg目录下,Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_LIBRARIES := libavformat libavcodec libavutil libpostproc libswscale
LOCAL_MODULE := ffmpeg
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))

libavformat/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_CFLAGS += -include "string.h" -Dipv6mr_interface=ipv6mr_ifindex
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

libavcodec/Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_LDLIBS := -lz
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

libavfilter、libavutil、libpostproc和libswscale下的Android.mk内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/../av.mk
LOCAL_SRC_FILES := $(FFFILES)
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/..
LOCAL_CFLAGS += $(FFCFLAGS)
LOCAL_STATIC_LIBRARIES := $(FFLIBS)
LOCAL_MODULE := $(FFNAME)
include $(BUILD_STATIC_LIBRARY)

最外层的jni/Android.mk和jni/ffmpeg/Android.mk我只是随便这样写的,你应该根据自己的需求改写。

⑹ android配置cocos2d-x环境怎么安装CDT

创建Android项目, 项目名称"CCTest". Youngs-MacBook-Air:~ young40$ cd /opt/cocos2d-2.0-x-2.0.3/ Youngs-MacBook-Air:cocos2d-2.0-x-2.0.3 young40$ ./create-android-project.sh use global definition of NDK_ROOT: /opt/android-ndk-r8b use global definition of ANDROID_SDK_ROOT: /opt/android-sdk-macosx Input package path. For example: org.cocos2dx.example com.young40 Now cocos2d-x supports Android 2.2 or upper version Available Android targets: ---------- id: 1 or "android-3" Name: Android 1.5 Type: Platform API level: 3 Revision: 4 Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P ABIs : armeabi ---------- id: 2 or "android-10" Name: Android 2.3.3 Type: Platform API level: 10 Revision: 2 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854 ABIs : armeabi ---------- id: 3 or "android-15" Name: Android 4.0.3 Type: Platform API level: 15 Revision: 3 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800 ABIs : armeabi-v7a, x86 ---------- id: 4 or "android-16" Name: Android 4.1 Type: Platform API level: 16 Revision: 2 Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in ABIs : armeabi-v7a input target id: 2 input your project name: CCTest Created project directory: /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/src/com/young40 Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/src/com/young40/CCTest.java Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/bin Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/libs Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/values Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/values/strings.xml Created directory /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/layout Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/res/layout/main.xml Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/AndroidManifest.xml Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/build.xml Added file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/proguard-project.txt Resolved location of library project to: /opt/cocos2d-2.0-x-2.0.3/cocos2dx/platform/android/java Updated project.properties Updated local.properties Updated file /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/proguard-project.txt Youngs-MacBook-Air:cocos2d-2.0-x-2.0.3 young40$ 6.编译默认的C++资源 Youngs-MacBook-Air:proj.android young40$ cd /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/ Youngs-MacBook-Air:proj.android young40$ ./build_native.sh NDK_ROOT = /opt/android-ndk-r8b COCOS2DX_ROOT = /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/../.. APP_ROOT = /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/.. APP_ANDROID_ROOT = /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android Using prebuilt externals make: Entering directory `/opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android' Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver Gdbsetup : libs/armeabi/gdb.setup Compile++ thumb : game_shared <= main.cpp In file included from /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/http://www.cnblogs.com/cocos2dx/platform/android/jni/JniHelper.h:27:0, from jni/hellocpp/main.cpp:2: /opt/android-ndk-r8b/platforms/android-14/arch-arm/usr/include/jni.h:592:13: note: the mangling of 'va_list' has changed in GCC 4.4 Compile++ thumb : game_shared <= AppDelegate.cpp Compile++ thumb : game_shared <= HelloWorldScene.cpp Prebuilt : libgnustl_static.a <= /sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/ Compile++ thumb : cocos2dx_static <= CCConfiguration.cpp .....中间编译输出省略 Prebuilt : curl.a <= /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/http://www.cnblogs.com/cocos2dx/platform/third_party/android/prebuilt/libcurl/libs/armeabi/ StaticLibrary : libextension.a SharedLibrary : libgame.so Install : libgame.so => libs/armeabi/libgame.so make: Leaving directory `/opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android'7. 创建Eclipse项目, 并运行默认Demo 如图, 选择Android Project from Existing Code. 地址选择为:/opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android (直接输入可能会报错, 请用鼠标选择目录) 点击下一步就将项目加入了Eclipse中.但是项目会报错. The import org.cocos2dx.lib cannot be resolved CCTest.java /com.young40.CCTest/src/com/young40 line 26 Java Problem Cocos2dxActivity cannot be resolved to a type CCTest.java /com.young40.CCTest/src/com/young40 line 30 Java Problem Cocos2dxActivity cannot be resolved to a type CCTest.java /com.young40.CCTest/src/com/young40 line 33 Java Problem我的解决办法是将: /opt/cocos2d-2.0-x-2.0.3/cocos2dx/platform/android/java作为一个项目添加进来, 即可解决报错问题. 8.编译运行 我尝试在Android2.3.3虚拟机运行项目失败. 没有关系, 我用真机测试. adb 无线连上真机(cm10真好, 自带无线调试) Youngs-MacBook-Air:proj.android young40$ /opt/android-sdk-macosx/platform-tools/adb connect 192.168.8.139:5555 connected to 192.168.8.139:5555OK, 运行成功, 如图. FPS有点低哈, 我的ipad2, 都能全速60帧. 9.创建名称为CCTest的Xcode项目. 创建后你可以运行测试下. 删除项目下Classes目录 然后将目录/opt/cocos2d-2.0-x-2.0.3/CCTest/Classes添加到项目.请确保Destination是没有被选中的.这样代码将是以引用的方式存在在项目中的. 修改Classes下HelloWorldScene.cpp, 并运行测试. CCLabelTTF* pLabel = CCLabelTTF::create("Hello Cocos2d-x!", "Thonburi", 34);成功.cocos2d-x 2.0.3的版本在ios6上有方向旋转的问题, 应该为横屏才对. 10.在Android中重新运行. 首先运行: /opt/cocos2d-2.0-x-2.0.3/CCTest/proj.android/build_native.sh 在Eclipse菜单中选择Project=>Clean清理下项目, 然后Run下, 可以在手机看到更改也已经生效. 11. 觉得上一步繁琐? 能不能点击Run同时也编译C++资源呢? 答案是可以的. 选中Eclipse左侧CCTest项目, 右键点击New=>Other, 在弹出对话框中选择C/C++=>Convert to a C/C++Proejct(Adds C/C++ Nature) 在接下来一屏中选择C++ Project以及 Project Type为Makefile project, Toolchains为Other 接下来Eclipse问是否切换到C++视图, 选择否. 如果不小心切换过去了, 再切换回java视图即可. 打开项目属性页面, 设置自动编译C++, 如图: 注意修改Build command为, 另外需要注意项目名称. bash ${workspace_loc:/com.young40.CCTest}/build_native.sh NDK_DEBUG=1 V=1 点击Run,之后我这里报错, 编译提示说"please define NDK_ROOT", 需要在项目设置中添加环境变量.如图 这个时候再点击Run, 会看到Console窗口会有编译的输出, 编译成功. 运行成功. 12.消除Eclipse中的错误提示. 如果打开项目jni目录下hellocpp/main.cpp文件, 会看到大量的报错. 我们需要讲相关文件添加到项目中. 首先添加/opt/cocos2d-2.0-x-2.0.3/CCTest/Classes到项目中.如图添加一个Link类型的文件夹. 用同样方法将"/opt/cocos2d-2.0-x-2.0.3/cocos2dx"添加到项目中. 然后如图添加引用. /opt/android-ndk-r8b/platforms/android-8/arch-arm/usr/include /opt/cocos2d-2.0-x-2.0.3/CocosDenshion/include 这里和子龙山人翻译的老外的文章做法略有不同, 他那个方法还是要报很多错, 可能是版本不同造成的. 我这个方法也不用忽略文件, 用什么类直接鼠标点击可以看到相应声明. 这样初步的IOS&Android开发环境就集成好了.

⑺ system.loadlibrary转移到jni中怎么写

System.loadLibrary("game")一般是调用编译好的DLL(WINDOWS下,LINUX,ANDORID下是.so文件)的,想知道详细内容可以去网上搜索下【JAVAJNI】CC开头的类估计是JAR包里的,想下载直接把cocos2d-android.jar放到网络里搜就好了

⑻ 如何在android上支持jna <二>实战步骤

1) 首先 JNA存在形式只是一个jna.jar 结构为java class + platform native
lib(libjnidispatch.so),现在支持的平台有win32 x86/amd64/mac, linux x86/bsd, sun os
等等,java层应该是通用,无需做改动。所以文章就做在怎样得到android平台辨认的native .so 上。

2) 确定思路,搭建jna/native arm交叉编译环境,得到android自己的jna.jar.

3) 源码下载,开源项目非常方便

$ svn co https //jna dev java net/svn/jna/trunk/jnalib

4) 选择编译器,考虑到jna是gnu项目,而且所有eabi编译器都兼容,所以选择arm-linux-none-gnueabi-gcc.

5) 进入源码树,

$ cd jnalib

6) 设置环境变量。java, gcc, ant等。

$ export
PATH=/opt/ant/bin:/opt/jdk1.6.0_11/bin:/opt/arm-none-linux-gnueabi/bin:/opt/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin:$PATH

$ export JAVA_HOME=/usr/java/jdk1.6.0_21/

7) 更改build.xml,native/makefile来支持arm平台。(比较长,可略过不看)

ndex:
native/Makefile
===================================================================
---
native/Makefile (revision 1146)
+++ native/Makefile (working
)
@@ -54,8 +54,8
@@
LIBSFX=.so
ARSFX=.a
JNISFX=$(LIBSFX)
-CC=gcc
-LD=gcc
+CC=arm-none-linux-gnueabi-gcc
+LD=arm-none-linux-gnueabi-gcc
LIBS=
#
Default to Sun recommendations for JNI compilation
COPT=-O2
-fno-omit-frame-pointer -fno-strict-aliasing
@@ -126,10 +126,12
@@
endif

ifeq ($(OS),linux)
-ARCH=$(shell uname -m | sed
's/i.86/i386/g')
+ARCH=arm #$(shell uname -m | sed
's/i.86/i386/g')
PCFLAGS+=-fPIC
CDEFINES+=-DHAVE_PROTECTION
LDFLAGS+=-Wl,-soname,$@
+FFI_CONFIG
+=
--host=arm-none-linux-gnueabi
+CINCLUDES+=-I/usr/include
endif

ifeq
($(OS),freebsd)
Index:
build.xml
===================================================================
---
build.xml (revision 1146)
+++ build.xml (working )
@@ -92,6
+92,7 @@
<os arch="ppc64"/>
<os
arch="sparcv9"/>
<os arch="amd64"/>
+ <os
arch="arm"/>
</or>
</condition>

<condition property="ld.preload" value="LD_PRELOAD_64"
else="LD_PRELOAD">
@@ -110,6 +111,9 @@
<condition
property="jre.arch" value="i386">
<equals arg1="x86"
arg2="${os.arch}"/>
</condition>
+ <condition
property="jre.arch" value="arm">
+ <equals arg1="arm"
arg2="${os.arch}"/>
+ </condition>
<condition
property="jre.arch" value="amd64">
<equals arg1="x86_64"
arg2="${os.arch}"/>
</condition>
@@ -285,6 +289,7 @@

< file="${dist}/out-of-date.jar" tofile="${dist}/win32-x86.jar"
overwrite="true"/>
< file="${dist}/out-of-date.jar"
tofile="${dist}/win32-amd64.jar" overwrite="true"/>
<
file="${dist}/out-of-date.jar" tofile="${dist}/linux-i386.jar"
overwrite="true"/>
+ < file="${dist}/out-of-date.jar"
tofile="${dist}/android.jar" overwrite="true"/>
<
file="${dist}/out-of-date.jar" tofile="${dist}/linux-amd64.jar"
overwrite="true"/>
< file="${dist}/out-of-date.jar"
tofile="${dist}/linux-ia64.jar" overwrite="true"/>
<
file="${dist}/out-of-date.jar" tofile="${dist}/freebsd-i386.jar"
overwrite="true"/>
@@ -598,6 +603,9 @@
<zipfileset
src="${dist}/linux-i386.jar"

includes="*jnidispatch*"

prefix="com/sun/jna/linux-i386"/>
+ <zipfileset
src="${dist}/arm-none-linux.jar"
+
includes="*jnidispatch*"
+
prefix="com/sun/jna/android"/>
<zipfileset
src="${dist}/linux-amd64.jar"

includes="*jnidispatch*"

prefix="com/sun/jna/linux-amd64"/>

8) 编译

$ ant -Djre.arch=arm -Dos.arch=arm -Dos.prefix=linux-arm

9)编译完成,你就可以在build下等到arm编译器编出来的jna.jar了, 如果你用eclipse,就可以直接Project...->add
Jar 使用它了。有可能(还不确定), android不支持在jar包中加本地native .so 的做法,你可以将jna.jar分拆开将java
class还以Jar的方式加载,而把linux-arm/下的libjnidispatch.so以add Lib..的方法加入,你可以尝试一下。
转载五品员外郎

⑼ 如何用Android NDK编译FFmpeg

android的NDK开发需要在linux下进行:

  1. 因为需要把C/C++编写的代码生成能在arm上运行的.so文件,这就需要用到交叉编译环境,而交叉编译需要在linux系统下才能完成。

  2. 安装android-ndk开发包,这个开发包可以在google android 官网下载: 通过这个开发包的工具才能将android jni 的C/C++的代码编译成库

  3. android应用程序开发环境: 包括eclipse、java、 android sdk、 adt等。

NDK编译步骤:

a.选择ndk自带的例子hello-jni,我的位于E:android-ndk-r5sampleshello-jni(根据具体的安装位置而定) 。

b.运行cygwin,输入命令cd /cygdrive/e/android-ndk-r5/samples/hello-jni,进入到E:android-ndk-r5sampleshello-jni目录。

c.输入$NDK/ndk-build,执行成功后,它会自动生成一个libs目录,把编译生成的.so文件放在里面。($NDK是调用我们之前配置好的环境变量,ndk-build是调用ndk的编译程序)

d.此时去hello-jni的libs目录下看有没有生成的.so文件,如果有,ndk就运行正常啦。

⑽ android和cocos2dx可以互调吗

在cocos2dx里访问/互调android里的activity方法/变量
不得不感叹下COCOS2DX的强大。。同一份游戏代码不加改动的可以放到android和iphone上面。
而最近在往ANDROID上放的时候,需要集成其它非官方运营渠道的API,而对方提供的API是jar包。所以需要在cocos2dx C++源文件中调用JAVA的API,因此有了以下DEMO代码:

activity里有如下定义:

Java代码

public void cppCall_nonStatic_logsth(){
//非静态方法
Log.i("cppCall_nonStatic", "test2~~~~!!!");
}

public static Object cppCall_logsth(){
//静态方法
Log.i("cppCall", "test~~~~!!!");
return activity;
}

AppDelegate.cpp里:
加上预定义(for android)

C++代码
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include <JniHelper.h>
#include <android/log.h>

#if 1
#define LOG_TAG "JniHelper"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#else
#define LOGD(...)
#endif

#endif

关键代码片段:

C++代码
JniMethodInfo minfo;
jobject jobj;
bool b = JniHelper::getStaticMethodInfo(minfo,
"com/loy/puzzles/Puzzles", //类路径
"cppCall_logsth", //静态方法名
"()Ljava/lang/Object;"); //括号里的是参数,后面的是返回值。
if (!b) {
LOGD("JniHelper::getStaticMethodInfo error...");
}else{
jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
}

JniHelper::getMethodInfo(minfo,
"com/loy/puzzles/Puzzles",
"cppCall_nonStatic_logsth",
"()V");
if(!b){
LOGD("JniHelper::getMethodInfo error...");
}else{
LOGD("ready to invoke method...");
minfo.env->CallVoidMethod(jobj, minfo.methodID);
}
最终LOGCAT打印日志如下:
12-29 12:46:33.891: D/JniHelper(2008): testing~~~
12-29 12:46:33.891: I/cppCall(2008): test~~~~!!!
12-29 12:46:33.891: D/JniHelper(2008): ready to invoke method...
12-29 12:46:33.891: I/cppCall_nonStatic(2008): test2~~~~!!!
12-29 12:46:33.891: D/JniHelper(2008): testing over~~~
即表示调用成功。

热点内容
我姐姐手机上的密码多少的短视频 发布:2025-07-02 13:09:10 浏览:799
轩逸安全配置全系一样吗都有哪些 发布:2025-07-02 13:07:30 浏览:522
合肥少儿编程哪家好 发布:2025-07-02 13:05:12 浏览:880
安卓快手极速版怎么签到 发布:2025-07-02 12:58:21 浏览:692
我与编程作文 发布:2025-07-02 12:57:33 浏览:230
安卓机在哪里调振动大小 发布:2025-07-02 12:53:31 浏览:848
linux系统如何查看服务器ip地址 发布:2025-07-02 12:51:57 浏览:245
dlna怎么指定服务器地址 发布:2025-07-02 12:51:08 浏览:215
ftp默认端口是多少 发布:2025-07-02 12:50:32 浏览:736
java隐藏 发布:2025-07-02 12:36:39 浏览:202