js如何调用c语言写的api

JavaScript016

js如何调用c语言写的api,第1张

包含api的.h文件,然后直接调用就可以了,比如winsock.h,可以调用recv等函数,也可以在函数前面加::

答案补充

HWND hWnd = ::FindWindow(sClassName, sWindowName)//传入类明到sClassName,窗口名sWindowName,否则传入NULL

通过webBrowser实现C#和javascript互调

实现步骤:

一、新建一个窗体,加入webBrowser控件

控件名:webBrowser1

二、在窗体后台代码加入如下定义

[System.Runtime.InteropServices.ComVisibleAttribute(true)]

public partial class Form1 : Form

{

...

}

三、加载网页

webBrowser1.Navigate(Application.StartupPath + "/UpDateReport.htm")

webBrowser1.ObjectForScripting = this//这句必须,不然js不能调用C#

四、调用脚本方法

/// <summary>

/// 脚本方法

/// </summary>

/// <param name="tag">JS函数名|参数1|参数2</param>

/// <returns></returns>

private object EXEC_JS(System.Windows.Forms.WebBrowser webBrowser, string tag)

{

string[] args = tag.Split('|')

if (args.Length == 1)

{

return webBrowser.Document.InvokeScript(args[0], null)

}

else

{

object[] objects = new object[args.Length - 1]

Array.Copy(args, 1, objects, 0, objects.Length)

return webBrowser.Document.InvokeScript(args[0], objects)

}

}

五、C#调用脚本方法例子,可以有返回值

//JS方法

<script language="javascript">

function js_fun(args)

{

alert("我是通过js脚本弹出的。你输入的内容是:"+args)

return "JAVASCRIPT"

}

</script>

//C#代码

object returnvalue = EXEC_JS(webBrowser1, "js_fun|参数字符串")

MessageBox.Show("js方法返回值是:" + returnvalue.ToString())

六、JS调用C#方法的例子

//C#方法

public string Test(string args)

{

return "你输入的是:"+args

}

//JS代码

<script language="javascript">

window.onload = function()

{

var CS_returnvalue= window.external.Test("aaa")

alert(CS_returnvalue)

}

</script>

在Cocos2d-JS v3.0 RC2中,与Android上js调用Java一样,Cocos2d-JS也提供了在iOS和Mac上js直接调用Objective-C的方法,示例代码如下:

var ojb = jsb.reflection.callStaticMethod(className, methodNmae, arg1, arg2, .....)

在jsb.reflection.callStaticMethod方法中,我们通过传入OC的类名,方法名,参数就可以直接调用OC的静态方法,并且可以获得OC方法的返回值。

参数中的类名,只需要传入OC中的类名即可,与Java不同,类名并不需要路径。比如你在工程底下新建一个类NativeOcClass,只要你将他引入工程,那么他的类名就是NativeOcClass,你并不需要传入它的路径。

import <Foundation/Foundation.h>

@interface NativeOcClass : NSObject

+(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content

@end

方法

js到OC的反射仅支持OC中类的静态方法。

方法名比较要需要注意,我们需要传入完整的方法名,特别是当某个方法带有参数的时候,你需要将他的:也带上。根据上面的例子。此时的方法名字是callNativeUIWithTitle:andContent:,不要漏掉了他们之间的:。

如果是没有参数的函数,那么他就不需要:,如下代码,他的方法名是callNativeWithReturnString,由于没有参数,他不需要:,跟OC的method写法一致。

+(NSString *)callNativeWithReturnString

使用示例

下面的示例代码将调用上面NativeOcClass的方法,在js层我们只需要这样调用:

var ret = jsb.reflection.callStaticMethod("NativeOcClass",

"callNativeUIWithTitle:andContent:",

"cocos2d-js",

"Yes! you call a Native UI from Reflection")

这里是这个方法在OC的实现,可以看到是弹出一个native的对话框。并把title和content设置成你传入的参数,并返回一个boolean类型的返回值。

+(BOOL)callNativeUIWithTitle:(NSString *) title andContent:(NSString *)content{

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title message:content delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]

[alertView show]

return true

}

此时,你就可以在ret中接受到从OC传回的返回值(true)了。

注意

在OC的实现中,如果方法的参数需要使用float、int、bool的,请使用如下类型进行转换:

float,int 请使用NSNumber类型

bool请使用BOOL类型。

例如下面代码,我们传入2个浮点数,然后计算他们的合并返回,我们使用NSNumber而不是int、float去作为参数类型。

+(float) addTwoNumber:(NSNumber *)num1 and:(NSNumber *)num2{

float result = [num1 floatValue]+[num2 floatValue]

return result

}

目前参数和返回值支持 int, float, bool, string,其余的类型暂时不支持。