Android Java调用libtwolib-first.a
输入:
新建jni目录,放入libtwolib-first.a、first.h、second.c、Android.mk四个文件
输出:
libtwolib-second.so(打包进apk了)、Caculator.apk
过程:
Android.mk内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) #下面这句加上去
LOCAL_LDFLAGS := $(LOCAL_PATH)/libtwolib-first.a
LOCAL_MODULE := twolib-second
LOCAL_SRC_FILES := second.c include $(BUILD_SHARED_LIBRARY)
second.c内容如下:
#include "first.h"
#include <jni.h> jint Java_com_suhan_Caculator_add( JNIEnv* env,
jobject this,
jint x,
jint y )
{
//return x+y;
return first(x,y);
}
Caculator内容如下:
package com.suhan;
public native int add(int x, int y);
static {
System.loadLibrary("hello-jni");
System.loadLibrary("demo-jni");
System.loadLibrary("twolib-second");
}
点击按钮:
int x = 3;
int y = 50;
int z = add(x, y);
String Z = Integer.toString(z);
answerValue.setText(Z);
右击Caculator工程属性,新建并配置一个Builder
Location填:
F:\android-ndk-r9\ndk-build.cmd
Working Directory填:
F:\adt-bundle-windows-x86_64-20130729\workspace001\Caculator

${workspace_loc:/Caculator}
点击Project|Clean,选中Caculator,即可生成libtwolib-second.so
点击Run Caculator按钮,即可生成Caculator.apk

Android Java调用libhello-jni.so、libdemo-jni.so
正确的:
HelloJni.java
package com.example.hellojni; public class HelloJni {
public native String stringFromJNI();
}
F:\adt-bundle-windows-x86_64-20130729\workspace001\Caculator\src\com\example\NativeMD5.java
package com.example;
public class NativeMD5 {


public native String encryptMD5(String text);

}
Caculator.java
package com.suhan;
import com.example.hellojni.HelloJni;
import com.example.NativeMD5;
public class Caculator extends Activity{
private HelloJni lib = new HelloJni();
private NativeMD5 md5 = new NativeMD5(); 点击按钮:
String x=lib.stringFromJNI();
answerValue.setText(x);
String x=md5.encryptMD5("123");
answerValue.setText(x);
static {
System.loadLibrary("hello-jni");
System.loadLibrary("demo-jni");
}
20150602测试Android回调Unity:
Android Java部分:
public static void AndroidFunc1(String arg)
{
UnityPlayer.UnitySendMessage("Main Camera","UnityFunc1",arg);
}

public static void AndroidFunc2()
{
UnityPlayer.UnitySendMessage("Main Camera","UnityFunc1","--AndroidFunc2--");
}
Unity C#部分:
if(bflag)
{
ajc.CallStatic("AndroidFunc2");
}
else
{
ajc.CallStatic("AndroidFunc1", new string[]{"Call 韩AndroidFunc1 2"});;
}
bflag=!bflag;
void UnityFunc1(string str)
{
strTest=str;
}


Android Java部分:
/UnityCPP/src/com/Bjoy/UnityCPP/MainActivity.java代码如下:
package com.Bjoy.UnityCPP;
import android.os.Bundle;
import android.view.Menu;
import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.main, menu);
return true;
}


//判断大小
public static int Max(int a,int b)
{
if(a>b)
return a;
return b;
}
} 命令行生成jar:
F:\adt-bundle-windows-x86_64-20130729\workspace001\UnityCPP\bin\classes>jar cvf com.Bjoy.UnityCPP.jar com\
或者
F:\soft\Android Tools\adt-bundle-windows-x86_64-20140702\workspace\UnityCPP\bin\classes>jar cvf com.Bjoy.UnityCPP.jar com

com.Bjoy.UnityCPP.jar放在F:\client\SimplestPluginExample\Unity Project Plugin\Assets\Plugins\Android\bin目录下
AndroidManifest.xml和res放在F:\client\SimplestPluginExample\Unity Project Plugin\Assets\Plugins\Android目录下
Unity C#部分:
private AndroidJavaClass ajc;
private int res = 0;
//通过unity提供的访问java插件的帮助类来找到我们的插件并创建对象
ajc = new AndroidJavaClass("com.Bjoy.UnityCPP.MainActivity");
res =ajc.CallStatic<int>("Max", new object[] { 10, 20 });
GUI.Label(new Rect(450, 420, 900, 120), "Max(10,20)="+res.ToString());
if(GUI.Button(new Rect(100,420,200,100), "ClickShake"))
{
res =ajc.CallStatic<int>("Max", new object[] { 6, 14 });
}

获取小米手机的物理地址:
ac:f7:f3:5b:13:02
查看路由器信息:
http://10.10.10.1/
主机名: MI2S-xiaomishou
ji
IP地址: 10.10.10.106
MAC地址: AC:F7:F3:5B:13:02
Android Java部分:
import android.util.Log;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
public static MainActivity inst;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
inst = this;
}
public static String getAndroidMacID()
{

String str = null;

WifiManager wifi = (WifiManager)inst.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
str = info.getMacAddress();

if(str==null)
{
Log.e("获取android mac地址失败", "0000000");
}
Log.e("获取android mac地址 "+str, "00000000");

return str;
}
Unity C#部分:
string strTest;
strTest=ajc.CallStatic<string>("getAndroidMacID");
GUI.Label(new Rect (450, 50, 900, 120),strTest);

AndroidManifest.xml添加:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
请将minSdkVersion的值改为9,如果出现下列错误:
DescriptionResourcePathLocationType
Call requires API level 9 (current min is 8): android.app.NativeActivity#getSystemServiceMainActivity.java
/UnityCPP/src/com/Bjoy/UnityCPPline 51Android Lint Problem


使用ndk构建共享库libASimplePlugin.so:
在F:\android-ndk-r9\samples\test-libstdc++下创建一个jni的文件夹(注:不能是其它文件夹名),接着在文件夹中创建代码文件ASimplePlugin.cpp和一个配置文件Android.mk。
先看看C++文件ASimplePlugin.cpp
/*
This is a simple plugin, a bunch of functions that do simple things.
*/ extern "C" {
const char* PrintHello(){
return "Hello";
} int PrintANumber(){
return 5;
} int AddTwoIntegers(int a, int b) {
return a + b;
} float AddTwoFloats(float a, float b) {
return a + b;
}
}
再看看配置文件Android.mk,文件中比较重要的两个变量 LOCAL_MODULE表示生成出的.so的名称 LOCAL_SRC_FILES 表示需要编译的文件,如果是多个C/C++文件中间需要使用 \ 隔开。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := ASimplePlugin LOCAL_SRC_FILES := ASimplePlugin.cpp
include $(BUILD_SHARED_LIBRARY)
执行ndk-build即可生成so库:
F:\android-ndk-r9\samples\test-libstdc++\jni>F:\android-ndk-r9\ndk-build.cmd
F:/android-ndk-r9/samples/test-libstdc++//jni/Android.mk:10: UILD_SHARED_LIBRARY
: No such file or directory
F:/android-ndk-r9/build/core/build-all.mk:89: Android NDK: WARNING: There are no
modules to build in this project!
make: *** No rule to make target `UILD_SHARED_LIBRARY'. Stop. F:\android-ndk-r9\samples\test-libstdc++\jni>F:\android-ndk-r9\ndk-build.cmd
"Compile++ thumb : ASimplePlugin <= ASimplePlugin.cpp
SharedLibrary : libASimplePlugin.so
Install : libASimplePlugin.so => libs/armeabi/libASimplePlugin.so
构建了共享库后,必须把共享库复制到unity3d工程中的Assets->Plugins->Android目录下。然后就可以在Unity中使用这个插件了。
Unity中调用F:\client\UnityTest20150509\Assets\Plugins\PluginName.dll、F:\client\SimplestPluginExample\Unity Project Plugin\Assets\Plugins\Android\libASimplePlugin.so:
SomeScript.cs中平台无关代码如下:
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices; public class SomeScript : MonoBehaviour {
// This tells unity to look up the function FooPluginFunction
// inside the plugin named "PluginName"
[DllImport ("PluginName")]
private static extern float FooPluginFunction ();
void Awake () {
// Calls the FooPluginFunction inside the PluginName plugin
// And prints 5 to the console
print (FooPluginFunction ());
} // Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

}
}

Win8下C#调用C++编译的32位标准DLL:
F:\hxhwin7\c#参考\myc#>cl /c PluginName.cpp
F:\hxhwin7\c#参考\myc#>link /DLL /OUT:PluginName.dll PluginName.obj
F:\hxhwin7\c#参考\myc#>csc /platform:x86 PluginName0.cs
Microsoft(R) Visual C# 编译器版本 4.0.30319.33440
用于 Microsoft(R) .NET Framework 4.5
版权所有 (C) Microsoft Corporation。保留所有权利。
F:\hxhwin7\c#参考\myc#>PluginName0
FooPluginFunction()=5

PluginName0.cs代码如下:
using System;
using System.Runtime.InteropServices; namespace Han
{
class PluginName0
{
// inside the plugin named "PluginName"
[DllImport("PluginName")]
private static extern float FooPluginFunction(); static void Main()
{
Console.WriteLine("FooPluginFunction()="+FooPluginFunction());
}
}
}

托管C++控制台程序命令行编译的例子:
using namespace System; int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
Console::Read();
return 0;
}
F:\hxhwin7\vcnet>cl /CLR ex20150507.cpp
Microsoft(R) C/C++ 优化编译器版本 16.00.30319.01
用于 Microsoft(R) .NET Framework 版本 4.00.30319.34014
版权所有(C) Microsoft Corporation。保留所有权利。 ex20150507.cpp
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved. /out:ex20150507.exe
ex20150507.obj F:\hxhwin7\vcnet>ex20150507
Hello World
C#调用C#编写的DLL:
F:\hxhwin7\vcnet>csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs
F:\hxhwin7\vcnet>csc /out:MyClient.exe /reference:MyDLL.DLL MyClient.cs

F:\hxhwin7\vcnet>csc /reference:MyDLL.DLL MyClient.cs
F:\hxhwin7\vcnet>MyClient 123 456
The result of swap is num1 = 456 and num2 =123
The MaxCD of 456 and 123 is 3



更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 万字长文带你了解最常用的开源 Squid 代理服务器
  3. 一款常用的 Squid 日志分析工具
  4. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  5. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  6. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  7. Android(安卓)TabLayout定制CustomView与ViewPager交互双向联动
  8. android 得到是否插入耳机设备
  9. 【android】去掉标题栏

随机推荐

  1. 众多Android(安卓)开源项目推荐,给力工作
  2. Android开发:APP引导页启动页小Demo(实例)
  3. Android事件分发机制以及滑动冲突处理
  4. 2011年,移动互联网加速蔓延 – 来自2011移
  5. Andorid Studio NDK开发-编译OpenSSL类库
  6. Android中的inflate()原理解析
  7. 关于android多任务同时下载的一点心得
  8. ListView页眉页脚效果VS android背景渐变
  9. Android在中国风光无限反衬了什么?
  10. A new way to hack android app info