2016-07-29 10:43:59 qq_22780533 阅读数 6710
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79746 人正在学习 去看看 李宁

我们知道,Android架构中上层应用是以java来编写的,而底层则用C/C++编写。一般而言,上层android工程师在开发过程中,不会或很少涉及到C/C++层,但项目中一旦涉及到复杂的算法或耗时操作时(例如图像处理等),通常使用C/C++完成算法实现并提供给java层(通过JNI)调用,以此提升软件的运行效率。在这个过程中,C/C++所实现的代码以及JNI调用相关的代码被打包为.so库,这即是所谓的目录设备上的二进制动态库(SHARED LIBRARY),而且.so库更安全,不容易被反编译。那么如何打包自己的.so库呢?

一、在Android studio 中配置NDK



在电脑的环境变量中加入NDK的路径


测试


成功!!!OK。

二、新建一个工程,先做一下配置

1、在app的build.gradl下加入

 defaultConfig {
        applicationId "jni.svse.com.jnitest2"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk{
            moduleName "NDKDEMO"         //生成的so名字
            ldLibs "log", "z", "m"       //链接时使用到的库
            abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无
        }
    }
2、在gradle.properties里添加
android.useDeprecatedNdk=true

3、在main下新建一个JNI文件夹


会生成jni文件夹
三、新建调用C/C++的类

public class Load {
    static {
        System.loadLibrary("NDKDEMO");//NDKDEMO可以随便取,但是必须和moduleName "NDKDEMO"  的名字一样
    }
    public  static native  int Add(int a,int b);
}


此时Add会出现红色,不要紧,Alt+Enter,android  studio会在jni下自动帮你生成NDKDEMO.c
#include <jni.h>

JNIEXPORT jint JNICALL
Java_jni_svse_com_jnitest2_Load_Add(JNIEnv *env, jclass type, jint a, jint b) {

    // TODO在这里编写你的逻辑代码,我这里是相加
    return a+b;

}


此时还没有生成.so库

以上2步后会在以下路径生成你的.so库了


生成的类型是根据以下红色来的

ndk{
            moduleName "NDKDEMO"         //生成的so名字
            ldLibs "log", "z", "m"       //链接时使用到的库
            abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无
 }


有了自己的.so库怎么使用呢
在新建一个工程,把.so库放到jniLibs下,在工程下新建一个和.so库包名一样的Package,Java_jni_svse_com_jnitest2_Load_Add包名是jni.com.jnitest2,然后再把上面的Load 复制到这里,在Activity里就可以使用了
int value=Load.Add(23, 5);







2017-03-21 15:17:53 tianmao111 阅读数 2602
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79746 人正在学习 去看看 李宁

Unity通过ndk调用javajava通过jni调用c++ .so

1:Jni的.so是独立的,还是依赖其他.so库或静态库?

答:都可以,但具体的.so拷贝到unity中后,是否还能正常调用,有待测试。

 

2:C++中jni与java回调函数,这里只举例静态函数调用


先保存回调函数的引用,具体的返回格式请查看jni文档

再调用函数


对应到java中的函数如下:



3:C++中jni与java是否可回调参数?

答:可以,具体方式请查看jni文档

 

4:java传递参数到c++,c++中需要注意转换:



Unity发布到安卓上,直接调用.so库:


1:.so是独立的,还是依赖其他.so库或静态库?

答:必须是独立的,当然打包时可以依赖于任何库,但最终输出的只能是一个整体库,多依赖的方式暂时未测试成功。

 

2:c++结构函数的书写方式:



3:c#传递字符串到c++可以这样写:


对应到c++中可以这样写:



4:c++是否可以返回字符串?

答:可以

C++需要这样写:


对应到c#端需要这样写:


5:c++是否可以使用回调函数

答:可以

 

C#需要这样写:


对应到c++里这样写:




6:c++是否可以使用回调参数

答:可以, c#需要传递指针给c++,要再非安全模式下


Unity发布到windows上,直接调用.dll


1:.dll是独立的,还是依赖其他.dll库或静态库?

答:都可以,如果是依赖其他动态库,则被依赖的dll也要拷贝到unity下

 

2:c++结构函数的书写方式:

函数前要接


3:c#传递字符串的时候应该这样写:


对应到c++里应该是这样的



4:是否可以返回字符串?

答:可以,需要这样写:



5:c++是否可以使用回调函数?

答:可以

C#对应的回调函数应该这样写:


ReckonContourCallback是一个委托

对应到c++里应该这样写:




6:c++是否可以使用回调参数?

答:可以

C#的回调参数需要这样写:


编辑器需要设置打开安全模式开关,并且函数前增加unsafe标志,采用指针作为回调手段,另外传入的指针参数必须是unsafe下的fixed的,要固定住堆中内存。

对应到c++里应该这样写:



注意事项:

另外需要注意的一些坑是,如果dll本身依赖了其他dll,这时需要把被依赖的dll也拷贝到Unity的Assets/Plugins下,但是Unity4.x可能会不好使,5.x正常,原因未知

 

在把打包好的.so库拷贝到Assets/Plugins下时需要注意,AndroidStudio可能一次打出多种平台的.so,但我们只能一次拷贝一个到Unity的Assets/Plugins下,否则会报库名重复冲突错误。

 

经过测试,在5.x下运行正常的.so到了4.x中可能会不正常,原因未知。

 

.so拷贝到Unity5.x的Assets/Plugins下后,需要设置其目标平台为你手机的cpu架构:


否则可能运行不正常。

 

Unity正常是不允许非安全模式代码的,否则会出现编译错误,不能运行,此时需要在Assets目录下创建一个文本文件,名称为gmcs内容如下:


并且重启编辑器,方可解决。

 

另外不推荐c#调用java再由java调用c++的方式,除非必要。不推荐多个动态链接库相互依赖的方式,即使可以运行

 

如果需要动态链接库(dll,.so)可以读取到sd卡上的文件,则在导出工程时需要配置如下:


C#端如果想传递路径给动态链接库读取sd卡内容,格式是这样的:



2015-12-05 11:37:03 cbbbc 阅读数 1369
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79746 人正在学习 去看看 李宁

首先明白.so分为两种,一种是linux下的.so,一种是NDK下的.so;本文主要讲解加载后一种.so

先来了解如何生成.so;

1、建立jni文件夹,创建android.mk和main.cpp文件

.mk内容如下:

LOCAL_PATH := $(call my-dir)

# compile VitClient.so
include $(CLEAR_VARS)   

LOCAL_MODULE    := libgame   //.so名称

LOCAL_SRC_FILES := main.cpp //需要直接的.cpp/.c文件

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include

include $(BUILD_SHARED_LIBRARY)

#include $(BUILD_STATIC_LIBRARY)

.cpp 文件内容:
extern "C"
{
    int AddNum(int a,int b)
    {
        return a+b;
    }
}

2、在jni同级目录创建build_native.sh脚本

内容如下:

# set params
NDK_ROOT_LOCAL=/Users/wuwuyuan/Desktop/android-sdk-macosx/android-ndk-r7b   //ndk 路径 设置成自己的
# build
# NDK 编译参数
# V=1    显示编译详细信息
# -B    强制重新编译
$NDK_ROOT_LOCAL/ndk-build 


3、mac下命令行   执行 sh build_native.sh   结果如图:


4、在unity中穿件android工程,新建Plugins/Android   将libgame.so 放在之下

5、编辑C# 脚本:

using System.Runtime.InteropServices;
public class PluginImport : MonoBehaviour {

    [DllImport ("game")]  //省略掉lib前缀和.so 后缀
    private static extern int AddNum(int a,int b);
   
    void Start () {
        Debug.Log("wwwwwww:"+AddNum(1,1));
    }
}

6、在android设备上可以看到打印出 wwwwwww:2

备注:必须在android真机或模拟器上能看到效果,在pc或mac上会报异常

工程下载地址

 补充:如何在mac下用NDK编.so

cd 到当前eclipse工程根目录,在根目录执行../android-ndk-r7b/ndk-build

编译过程:

Compile++ arm    : shadowmapping <= BaseGLSLProgram.cpp
Compile++ arm    : shadowmapping <= bitmap.cpp
Compile++ arm    : shadowmapping <= button.cpp
Compile++ arm    : shadowmapping <= main.cpp
Compile thumb  : android_native_app_glue <= android_native_app_glue.c
StaticLibrary  : libandroid_native_app_glue.a
Prebuilt       : libgnustl_static.a <= <NDK>/sources/cxx-stl/gnu-libstdc++/libs/armeabi/

原文地址:http://www.cnblogs.com/U-tansuo/archive/2013/04/02/unity3d_Plugin_android_so.html

2015-11-13 16:52:47 sgnyyy 阅读数 5563
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79746 人正在学习 去看看 李宁

首先明白.so分为两种,一种是linux下的.so,一种是NDK下的.so;本文主要讲解加载后一种.so

先来了解如何生成.so;

1、建立jni文件夹,创建android.mk和main.cpp文件

.mk内容如下:

LOCAL_PATH := $(call my-dir)

# compile VitClient.so
include $(CLEAR_VARS)   

LOCAL_MODULE    := libgame   //.so名称

LOCAL_SRC_FILES := main.cpp //需要直接的.cpp/.c文件

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include 

include $(BUILD_SHARED_LIBRARY) 

#include $(BUILD_STATIC_LIBRARY)

.cpp 文件内容:
extern "C"
{
    int AddNum(int a,int b)
    {
        return a+b;
    }
}

2、在jni同级目录创建build_native.sh脚本

内容如下:

# set params
NDK_ROOT_LOCAL=/Users/wuwuyuan/Desktop/android-sdk-macosx/android-ndk-r7b   //ndk 路径 设置成自己的
# build
# NDK 编译参数
# V=1    显示编译详细信息
# -B    强制重新编译
$NDK_ROOT_LOCAL/ndk-build

3、mac下命令行   执行 sh build_native.sh   结果如图:

4、在unity中穿件android工程,新建Plugins/Android   将libgame.so 放在之下

5、编辑C# 脚本:

using System.Runtime.InteropServices;
public class PluginImport : MonoBehaviour {

    [DllImport ("game")]  //省略掉lib前缀和.so 后缀
    private static extern int AddNum(int a,int b);
    
    void Start () {
        Debug.Log("wwwwwww:"+AddNum(1,1));
    }
}

6、在android设备上可以看到打印出 wwwwwww:2

备注:必须在android真机或模拟器上能看到效果,在pc或mac上会报异常

工程下载地址

 补充:如何在mac下用NDK编.so

    cd 到当前eclipse工程根目录,在根目录执行../android-ndk-r7b/ndk-build

编译过程:Compile++ arm    : shadowmapping <= BaseGLSLProgram.cpp
Compile++ arm    : shadowmapping <= bitmap.cpp
Compile++ arm    : shadowmapping <= button.cpp
Compile++ arm    : shadowmapping <= main.cpp
Compile thumb  : android_native_app_glue <= android_native_app_glue.c
StaticLibrary  : libandroid_native_app_glue.a
Prebuilt       : libgnustl_static.a <= <NDK>/sources/cxx-stl/gnu-libstdc++/libs/armeabi/

2013-04-02 19:21:00 weixin_30722589 阅读数 4
  • Android 5.x视频课程

    采用Android5.x进行讲解。本课程包含了几乎所有的Android开发技术,例如,Eclipse和Android Studio开发环境的搭建、各种控件的详细使用方法、布局、四大应用程序组件、数据存储、网络、对话框、Toast、通知、Intent、Android5.x新特性、Fragment、ActionBar、拖放技术、组件开发、硬件访问、定时器、Android NDK等技术。

    79746 人正在学习 去看看 李宁

首先明白.so分为两种,一种是linux下的.so,一种是NDK下的.so;本文主要讲解加载后一种.so

先来了解如何生成.so;

1、建立jni文件夹,创建android.mk和main.cpp文件

.mk内容如下:

LOCAL_PATH := $(call my-dir)

# compile VitClient.so
include $(CLEAR_VARS)   

LOCAL_MODULE    := libgame   //.so名称

LOCAL_SRC_FILES := main.cpp //需要直接的.cpp/.c文件

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include

include $(BUILD_SHARED_LIBRARY)

#include $(BUILD_STATIC_LIBRARY)

.cpp 文件内容:
extern "C"
{
    int AddNum(int a,int b)
    {
        return a+b;
    }
}

2、在jni同级目录创建build_native.sh脚本

内容如下:

# set params
NDK_ROOT_LOCAL=/Users/wuwuyuan/Desktop/android-sdk-macosx/android-ndk-r7b   //ndk 路径 设置成自己的
# build
# NDK 编译参数
# V=1    显示编译详细信息
# -B    强制重新编译
$NDK_ROOT_LOCAL/ndk-build

3、mac下命令行   执行 sh build_native.sh   结果如图:

4、在unity中穿件android工程,新建Plugins/Android   将libgame.so 放在之下

5、编辑C# 脚本:

using System.Runtime.InteropServices;
public class PluginImport : MonoBehaviour {

    [DllImport ("game")]  //省略掉lib前缀和.so 后缀
    private static extern int AddNum(int a,int b);
   
    void Start () {
        Debug.Log("wwwwwww:"+AddNum(1,1));
    }
}

6、在android设备上可以看到打印出 wwwwwww:2

备注:必须在android真机或模拟器上能看到效果,在pc或mac上会报异常

工程下载地址

 补充:如何在mac下用NDK编.so

    cd 到当前eclipse工程根目录,在根目录执行../android-ndk-r7b/ndk-build

编译过程:Compile++ arm    : shadowmapping <= BaseGLSLProgram.cpp
Compile++ arm    : shadowmapping <= bitmap.cpp
Compile++ arm    : shadowmapping <= button.cpp
Compile++ arm    : shadowmapping <= main.cpp
Compile thumb  : android_native_app_glue <= android_native_app_glue.c
StaticLibrary  : libandroid_native_app_glue.a
Prebuilt       : libgnustl_static.a <= <NDK>/sources/cxx-stl/gnu-libstdc++/libs/armeabi/

 

 

转载于:https://www.cnblogs.com/U-tansuo/archive/2013/04/02/unity3d_Plugin_android_so.html

没有更多推荐了,返回首页