當前位置:首頁 » 安卓系統 » 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~~~
即表示調用成功。

熱點內容
怎麼下載壓縮包 發布:2024-05-19 04:47:47 瀏覽:9
二嫂水仙ftp 發布:2024-05-19 04:47:42 瀏覽:160
雲隙伺服器下載 發布:2024-05-19 04:33:22 瀏覽:315
德國C語言 發布:2024-05-19 04:13:40 瀏覽:963
音頻管理器沒有文件夾 發布:2024-05-19 04:13:36 瀏覽:667
qq郵箱埠993伺服器怎麼填 發布:2024-05-19 04:07:05 瀏覽:204
javaapi框架 發布:2024-05-19 04:06:59 瀏覽:363
與存儲結構無關的術語 發布:2024-05-19 04:05:41 瀏覽:500
編譯路由器固件選擇 發布:2024-05-19 03:56:28 瀏覽:42
手機f加密 發布:2024-05-19 03:28:47 瀏覽:225