androidnative調用
⑴ Unity在Android和iOS中如何調用Native API
首先unity支持在C#中調用C++ dll,這樣可以在Android和iOS中提供C++介面在unity中調用。利用這一特性,可以擴展unity的功能。例如集成和調用第三方庫。同時為了滿足對unity介面的一致性,可以考慮在android和iOS上提供相同的介面供C#調用。這里列舉以下兩個例子。本例對應的介面聲明如下:public class CallNativeAPI { #if UNITY_EDITOR public static void OpenWebView(string url) { return; } public static void SumNum(int v1, int v2) { TestUnityEditor.SumNum(v1, v2); return; } #elif UNITY_IPHONE [DllImport ("__Internal")] public static extern void OpenWebView(string url); [DllImport ("__Internal")] public static extern void SumNum(int v1, int v2); #elif UNITY_ANDROID [DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)] public static extern void OpenWebView(string url); [DllImport ("libtestunity", CallingConvention = CallingConvention.Cdecl)] public static extern void SumNum(int v1, int v2); #endif public static void SumNumForResult(int v1, int v2, CallbackManager.ResultCallback callback) { TestCallbackManager.sumNumCallback.SetResultCallBack(new CallbackManager.ResultCallback(callback)); SumNum(v1, v2); return; } } namespace CallbackManager { public delegate void ResultCallback(int result); public class SumNumManager{ public SumNumManager() { } private ResultCallback resultCallback; public void SetResultCallBack(ResultCallback callback) { resultCallback = callback; } public void SendResult(int result) { resultCallback(result); } } } public class TestCallbackManager { public static CallbackManager.SumNumManager sumNumCallback = new CallbackManager.SumNumManager(); }
⑵ android 的native方法,在哪使用System.loadLib()方法
不是loadLib,是
java">static{
System.loadLibrary("你的庫名");
}
這個是在類被載入的時候載入的,也就是你的Test。你說的有些沒有使用load,是因為在系統啟動的時候so已經被載入了。你可以通過命令行看到系統裡面的很多so:
如果so被載入了,你就不需要再使用載入代碼,可以直接用native介面
⑶ Android 中Native方法是怎樣調用的
1. Power.java--> find corresponding native cfile(查找對應的具體用C實現的C文件)
android.os.Power.java -------- native file ---->.../jni/android_os_Power.c
2. in android_os_Power.c, you canfind:
static JNINativeMethod method_table[]= // Native functiontable
{
{"acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock},
{"releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock},
{"setLastUserActivityTimeout", "(J)I",(void*)setLastUserActivityTimeout },
{"setScreenState", "(Z)I", (void*)setScreenState },
{"shutdown", "()V", (void*)android_os_Power_shutdown },
{ "reboot","(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
};
int register_android_os_Power(JNIEnv *env)// function to register mapping tablefrom name to function
{
returnAndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}
3. in /framework/base/core/jni , a file named:AndroidRuntime.cpp
3.1) a global register function array
static const RegJNIRec gRegJNI[] =
{
...
register_android_os_Power,
}
3.2) Register native function process
int AndroidRuntime::startReg(JNIEnv* env)
or
Java_com_android_internal_util_WithFramework_registerNatives(...)
or
Java_LoadClass_registerNatives(....)
---> register_jni_procs(gRegJNI, NELEM(gRegJNI),env)
---> foreach(member of gRegJNI) call register_XXX_XXX_XXX..XXX() //so here register_android_os_power() will becalled
---> AndroidRuntime::registerNativeMethods(env, class_namelike "android/os/Power", method table like method_table,size)
---> jniRegisterNativeMethods(env, className,gMethods, numMethods)
-->pEnv->RegisterNatives(env, clazz, gMethods,numMethods) ;
--> foreach(method) calldvmRegisterJNIMethod(ClassObject* clazz, const char*methodName,
constchar* signature, void* fnPtr)
--> calldvmSetNativeFunc(method, dvmCallSynchronizedJNIMethod, fnPtr); //for sycn method
or
call dvmSetNativeFunc(method, dvmCallJNIMethod,fnPtr);
--> ((Method*)method)->insns = insns; // set actual codespace to be executed for a native function
4.calling a native method ( JNI method)
void dvmPlatformInvoke(void* pEnv,ClassObject* clazz, int argInfo, int argc,
const u4*argv, const char* shorty, void* func, JValue*pReturn)
dvmCallMethod() /dvmInvokeMethod
---> if(dvmIsNativeMethod(method))
{
(*method->nativeFunc)(self->curFrame,&retval, method, self);
}
⑷ native.js android 怎麼調用不開源的動態庫
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<script type="text/javascript">
//java代碼調用js方法
function javacalljs(){
document.getElementById("content").innerHTML +=
"<br\>java調用了js函數";
}
</script>
</head>
<body>
this is my html <br/>
//js調用java方法,所有js全局對象、函數以及變數均自動成為window對象的成員
<a onClick="window.wst.jsCallAndroid()">點擊調用java代碼</a><br/>
<br/>
<div id="content">內容顯示</div>
</body>
</html>
⑸ Android很多java 文件調用native函數為何沒有System.loadLibrary或System.load
android不是標準的jvm,只是使用了java的語法,其他基本都是自己發明的
連位元組碼格式都不一樣
另外,你去看標准javase裡面也有很多本地方法沒有用那些載入
因為那些本地方法是jvm實現的,不是用第三方動態庫實現的
比如 Math.sin 方法,都是jvm自己的
⑹ Unity在Android和iOS中如何調用Native API
首先unity支持在C#中調用C++ dll,這樣可以在Android和iOS中提供C++介面在unity中調用。利用這一特性,可以擴展unity的功能。例如集成和調用第三方庫。同時為了滿足對unity介面的一致性,可以考慮在android和iOS上提供相同的介面供C#調用。
這里列舉以下兩個例子。
2. 2. 簡單的C# - C++ - Java/ObjC - C#的非同步回調實現(會在下一期中給出實現)
由於android和iOS平台載入庫的方式不同(android為動態載入,iOS為靜態載入),在C#中針對不同平台對dll 介面的引用聲明是不一樣的。本例對應的介面聲明如下:publicclassCallNativeAPI{
#ifUNITY_(stringurl){return;}publicstaticvoidSumNum(intv1,
intv2){TestUnityEditor.SumNum(v1,v2);return;}#elifUNITY_IPHONE
[DllImport(
"__Internal")](stringurl);[DllImport(
"__Internal")]publicstaticexternvoidSumNum(intv1,
intv2);#elifUNITY_ANDROID
[DllImport(
"libtestunity"
,CallingConvention=CallingConvention.Cdecl)](stringurl);[DllImport(
"libtestunity"
,CallingConvention=CallingConvention.Cdecl)]publicstaticexternvoidSumNum(intv1,
intv2);#(intv1,
intv2,CallbackManager.ResultCallbackcallback){
⑺ 如何調試Android Native Framew
半年前寫了一篇文章,介紹 如何調試Android Framework。但是只提到了Framework中Java代碼的調試辦法,但實際上有很多代碼都是用C++實現的;無奈當時並並沒有趁手的native調試工具,無法做到像Java調試那樣簡單直觀(gdb+eclipse/ida之流雖然可以但是不完美),於是就擱置下了。
Android Studio 2.2版本帶來了全新的對Android Native代碼的開發以及調試支持,另外LLDB的Android調試插件也日漸成熟,我終於可以把這篇文章繼續下去了!本文將帶來Android Framework中native代碼的調試方法。
在正式介紹如何調試之前,必須先說明一些基本的概念。調試器在調試一個可執行文件的時候,必須知道一些調試信息才能進行調試,這個調試信息可多可少(也可以沒有)。最直觀的比如行號信息,如果調試器知道行號信息,那麼在進行調試的時候就能知道當前執行到了源代碼的哪一行,如果調試器還知道對應代碼的源文件在哪,那麼現代IDE的調試器一般就能順著源碼帶你飛了,這就是所謂的源碼調試。相反,如果沒有行號和源碼信息,那麼只能進行更低級別的調試了,調試器只能告訴你一些寄存器的值;而當前運行的代碼也只是PC寄存器所指向的二進制數據,這些數據要麼是虛擬機指令,要麼是匯編指令;這就是所謂的無源碼調試。顯然無源碼調試相比源碼級別的調試要麻煩的多;接下來將圍繞這兩個方面分別介紹。
http://blog.csdn.net/sinat_29384657/article/details/76685742
⑻ Android 中Native方法是怎樣調用的
通過jni介面調用native
步驟如下:
1.創建一個 android project, 名字叫Why
2 在工程Why中添加一個Java類,class名為Jni。這個類是一個JNI介面的Java類,文件名為Jni.java。
package com.yarin.android.Why;
public class Jni {
public native int getCInt();
public native String getCString();
}
3.將工程Why下的 "src\com\yarin\android\Why" 目錄下的Jni.java文件到「Why\bin\classes」下.
4.Generate Jni.class file via the command below:
javac jni.java
Then the Jni.class file generated to cover and replace the original Jni.class file in directory 「Why\bin\classes\com\yarin\android\Why」.
------The original Jni.class file, you must build the java project first to generate it.
5.Generate c style header file
javah –classpath C:\android-ndk-r6b\myproject\Why\bin\classes com.yarin.android.Why.Jni
com.yarin.android.Why is my package name appeared in Jni.java file.
com_yarin_android_Why_Jni.h is like below:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_yarin_android_Why_Jni */
#ifndef _Included_com_yarin_android_Why_Jni
#define _Included_com_yarin_android_Why_Jni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_yarin_android_Why_Jni
* Method: getCInt
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_yarin_android_Why_Jni_getCInt
(JNIEnv *env, jobject object); ---you need to supplement the parameter name yourself
/*
* Class: com_yarin_android_Why_Jni
* Method: getCString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_yarin_android_Why_Jni_getCString
(JNIEnv *env, jobject object);
#ifdef __cplusplus
}
#endif
#endif
6.Add com_yarin_android_Why_Jni.c file corresponding to the above c style header file, then add implemented code.
#include <stdio.h>
#include <stdlib.h>
#include "com_yarin_android_Why_Jni.h"
int add()
{
int x,y;
x = 111;
y = 22;
x += y;
return x;
}
JNIEXPORT jint JNICALL Java_com_yarin_android_Why_Jni_getCInt
(JNIEnv *env, jobject object)
{
return add();
}
JNIEXPORT jstring JNICALL Java_com_yarin_android_Why_Jni_getCString
(JNIEnv *env, jobject object)
{
(*env)->NewStringUTF(env, " Why is ok ^_^ ----->> ");
}
7.然後實現在工程Why下創建目錄jni,並且 com_yarin_android_Why_Jni.c /h 到jni目錄下。
8.在"Why\jni"目錄下編寫Android.mk ,在"android-ndk-r6b\jni"下編寫Application.mk , 然後在NDK環境下編譯native code,生成動態庫libWhy.so。
9.在java工程中加入調用native 動態庫的代碼:
package com.yarin.android.Why;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class WhyActivity extends Activity {
static
{
System.loadLibrary("Why");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Jni jni = new Jni();
TextView view = new TextView(this);
view.setText(jni.getCString() + Integer.toString(jni.getCInt()));
setContentView(view);
}
}
10 編譯Why工程,然後 run as Android Application, 就能看到native code的調用結果了。
Tip:
Usage of the command javah.
javah -d <outputdir> -classpath <classpath> <fully_qualified_class>
where:
'outputdir' is the directory where to put the generated header file
'classpath' contains an absolute path to the directory containing your root package (as mentionned by Glen)
'fully_qualified_class' is the name of the class containing native methods without .class extension
-jni option is not required (set by default)
⑼ Android 中Native方法是怎樣調用的
1.Power.java--> find corresponding native cfile(查找對應的具體用C實現的C文件) android.os.Power.java:native file ---->.../jni/android_os_Power.cpp2. in android_os_Power.c, you canfind: 點擊(此處)折疊或打開static JNINativeMeth