精华内容
下载资源
问答
  • 按理说是可以的吧?有木有可能通过反编译得到访问它服务器的方式。。。 ------------------------- PS:Windows speech engine相比之下烂透了
  • 现在需要确定一个需求,在一个安卓工程里调用windows的类库(已经通过VS2015编译成dll文件) 请问这个需求是否可行? 我网上找了很多安卓如何调用dll文件的文章,很多人说不行,有些人说行并给出了步骤,但我...
  • Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问题 unity里怎么使用java插件 unity android中怎么接受汉字 unity调用Android应用程序的步骤 说明一点:这里我们要调用的手...

    开发环境:

    • Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2
    • Unity3.4 + windows7

    测试设备:

    • HTC Desire HD

    本文要涉及到的几个重点问题

    1.  unity里怎么使用java插件
    2.  unity android中怎么接受汉字
    3.  unity调用Android应用程序的步骤

    说明一点:这里我们要调用的手机应用程序是发信息的apk程序。

    unity里怎么使用java插件

    unity里面能使用插件这是unity人都知道的,相信大家都了解过iTween、iGUI、EZGUI等插件,但我们这里要说的是我们自定义的来供我们开发使用的插件。Unity支持基于C,C++或Objctive-C语言的插件。插件允许你使用Unity代码调用本地代码库。这使得Unity可以整合其他中间件库或者遗留的游戏代码。插件是Pro版独有特性。对于桌面系统的构建,插件仅仅能在独立版中运行。而构建网页版本时由于安全问题会被禁用。鉴于这里我们主要是研究unity访问android的应用程序,所以我将只提及java代码写出来的插件(编译后的class文件打成的jar包)。

    具体关于插件的内容请参看官方手册

    E文差的同学可以看这里

    基础内容就说这么多,下面开始我们的具体内容:

    首先在Eclipse中新建一个Android工程,这个没有什么说的。创建完项目之后要做的有两点:

    1、将Unity中关于编译Android程序的jar包导入到我们的项目中,具体右击项目选择Properties:

    Eclipse导入Unity3D提供的编译Android游戏所需要的jar包

     

    这里unityclasses.jar就是unity 提供的编译Android游戏所需要的jar包,它所在的目录是:

    %unity_home%\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar

    我们新建的项目默认继承自Activity,这里将其修改为继承自UnityPlayerActivity,并去掉

    setContentView(R.layout.main);

    即:

    1
    2
    3
    4
    5
    6
    7
    8
    public class SMSActivity extends UnityPlayerActivity {
     
        public void onCreate(Bundle savedInstanceState) {
     
          super.onCreate(savedInstanceState);
     
        }
    }

    在UnityPlayerActivity的onCreate()方法中已经做好了针对unity自己游戏的view布局,这里我们将onCreate继承过来不能将他们的布局给重写掉,否则我们的游戏画面就看不到在unity中做出的绚丽游戏场景了。 准备工作完成了,下面来添加我们的发信息逻辑的具体方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //我这里所需要的参数是对方的手机号码和要发送的短信息的内容,
     
    //在unity中调用该方法时传入这两个参数
     
    public static void SMSSend(String number, String content){
     
        SmsManager sms = SmsManager.getDefault();
     
        sms.sendTextMessage(number, null, content, nullnull);
     
    }

    这里需要注意的一点就是调用发信息的功能需要在Androidmanifest.xml中声明权限:

    1
    <uses-permission android:name="android.permission.SEND_SMS"/>

    好了,我们在Eclipse中要做的工作就到这里了,接下来是把我们写好的Java代码编译成我们需要的插件jar文件。 打开cmd,进入到我们的项目bin\classes文件夹下执行下面命令:

    jar cvf com.qyxls.sms.jar com\
    Java编译用于Unity3D开发的插件

     

    这时候在bin\classes文件夹下会发现一个com.qyxls.sms.jar。这就是我们需要的插件了。(我也有试着从Eclipse中导出jar文件,但不知道为什么最后插件不能使用)

    接下来是创建我们的Unity工程了,同样的,步骤不说。创建完成之后在Project视图中新建一个Plugins文件夹(注意名字不要错,起初我漏掉了一个s都调试了好半天的),再在新创建好的Plugins文件夹下创建一个Android文件夹,然后在Android文件夹下新建一个bin文件夹用来存放我们上一步骤中做出来的jar插件。最后不要忘了把Android项目中的配置文件Androidmanifest.xml文件要考到该目录下,这里面有我们添加的权限信息,不然运行unity程序发信息会报安全错误的。由于该文件中还用到一些资源,所以一并把res文件夹也全部拷贝到Android文件夹下。

    Unity3D调用安卓应用程序

     

    这个样子和Android的项目结构又差不多了吧。

    接下来我们的工作重心转移到unity的代码编写上来。首先就是做出我们的一个测试界面,这个不多说,看效果图直接上代码(这个是很简单很简单的了)。

    Unity3D调用安卓应用程序

     

    代码:

    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
    using UnityEngine;
     
    using System.Collections;
     
    public class Scripts : MonoBehaviour {
     
        public GUISkin mySkin;
     
        private string txtNumber = "";
     
        private string txtMessage = "";
     
        void OnGUI()
     
        {
     
            GUI.skin = mySkin;
     
            GUI.Label(new Rect(40, 40, 100, 50), "电话号码");
     
            txtNumber = GUI.TextField (new Rect (140, 40, 160, 30), txtNumber);
     
            GUI.Label(new Rect(40, 80, 100, 50), "短信内容");
     
            txtMessage = GUI.TextArea (new Rect (140, 80, 200, 160), txtMessage);
     
            if(GUI.Button(new Rect(240, 250, 100, 40), "发送"))
     
            {
     
            }
        }
    }

    按照上面的步骤做完的同学会发现:我运行到手机上的应用怎么没有Label和Button上的汉字提示呢?这里就是我们要提到的另一个重点。

    在Android手机上显示汉字

    首先要使用中文就得有个中文字体了,我这个是用的Android手机上系统的默认字体DroidSansFallback.ttf。找不到字体的同学也可以去我们计算机C盘下去找一个中文字体来用,但要注意找的字体一定要是ttf格式的,这个是unity支持的。

    找到字体后的导入方式是和其它资源导入一样的,可以新建一个Resources文件夹来放我们的中文字体,导入之后选中字体,在属性面板中要设置为unicode。

    Unity3D调用安卓应用程序

     

    点击Apply后要等待好长一段时间等待unity生成一张巨大的字体贴图。

    Unity3D调用安卓应用程序

     

    从贴图尺寸和大小也可以看出,中文字体是很费资源的,这里也建议大家万不得已要用到中文字的话,尽量把需要的字做成图片来用,以达到节省我们宝贵的手机资源的目的。

    这样之后我们要告诉unity我们所使用的中文字体:新建一个GUISkin,并将字体设置为我们刚刚导入并设置好的中文字体即可。

    Unity3D调用安卓应用程序

     

    然后将刚刚建立的GUISkin赋值给mySkin,这样我们的应用就能显示和输入中文了。

    在unity中调用Java插件

    现在终于到了我们的核心:在unity中调用Java插件来实现我们需求的功能了。先来看一下核心代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private AndroidJavaClass ajc;
     
    void Start ()
    {
        //通过unity提供的访问java插件的帮助类来找到我们的插件并创建对象
        ajc = new AndroidJavaClass("com.qyxls.sms.SMSActivity");
    }
     
    void SendMsg(string number, string msg)
    {
        //调用插件中的SMSSend方法发送信息
        ajc.CallStatic("SMSSend"new string[]{number, msg});
    }

    CallStatic这个函数需要两个参数,第一个是要调用的插件里的函数名,第二个是要调用的函数所需要的参数,要以数组的形式传入,参数可以是任意类型的。

    其他的关于这个类的使用可以参照文档。

    我们把SendMsg函数添加在发送按钮的响应事件里就可以了:

    1
    2
    3
    4
    5
    6
    7
    if(GUI.Button(new Rect(240, 250, 100, 40), "发送"))
    {
        if(txtNumber != "" && txtMessage != "")
        {
            SendMsg(txtNumber, txtMessage);
        }
    }

    我们来看看效果,这里避免骚扰别人,并且再给我们的测试来一个反馈,我就麻烦一下一直为我们服务的中国移动了。

    Unity3d调用安卓应用程序

     

    全段完整的代码如下:

    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
    using UnityEngine;
     
    using System.Collections;
     
    public class Scripts : MonoBehaviour {
     
    public GUISkin mySkin;
     
    private string txtNumber = "";
     
    private string txtMessage = "";
     
    private AndroidJavaClass ajc;
     
    void Start ()
    {
        ajc = new AndroidJavaClass("com.qyxls.sms.SMSActivity");
    }
     
    void OnGUI()
    {
        GUI.skin = mySkin;
        GUI.Label(new Rect(40, 40, 100, 50), "电话号码");
        txtNumber = GUI.TextField (new Rect (140, 40, 160, 30), txtNumber);
        GUI.Label(new Rect(40, 80, 100, 50), "短信内容");
        txtMessage = GUI.TextArea (new Rect (140, 80, 200, 160), txtMessage);
        if(GUI.Button(new Rect(240, 250, 100, 40), "发送"))
        {
            if(txtNumber != "" && txtMessage != "")
            {
                SendMsg(txtNumber, txtMessage);
            }
        }
    }
     
    void SendMsg(string number, string msg)
    {
        ajc.CallStatic("SMSSend"new string[]{number, msg});
    }
    }

    到这里我们的工作就全部做完了,整个过程就是上面说明的这些了。

    其实,要调用发信息的apk,还有一个更简单的方法的,就是利用Application类的OpenURL来调用:

    1
    Application.OpenURL("sms:");

    这样会调出发短息的应用界面,而且里面还可以带参数的,但我们这里的重点是说如何使用Java插件的问题,那个方法就不做讨论了。

    原文:guzhou.me

     

    声明: 本文由( zqcyou )原创编译,转载请保留链接: Unity开发Android应用程序:调用安卓应用程序功能

    转载于:https://www.cnblogs.com/catWang/p/Unity%e5%bc%80%e5%8f%91Android%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f.html

    展开全文
  • 如下图操作,点击windows菜单-》Prefrence菜单:弹出如下图:选择Andriod ->NDK:配置完成以后,点击工程属性菜单:做这一步的目的是,增加对c++代码的支持,他会自动生成一些东西,你会看到多一个jni的文件夹。这...

    首先建议一个工程 HelloJni如下图:

    8b939ddc5fd13ea1a68453b4380b858b.png

    按照默认的配置下一步,直到完成 。

    3c8c8a487d7f1c5eb2a3ec065a869d45.png

    如下图操作,点击windows菜单-》Prefrence菜单:

    d679a45b240059e5e2391f7e8164576f.png

    弹出如下图:选择Andriod ->NDK:

    2f429887b1dbbdf498fa34b1664f0d4f.png

    配置完成以后,点击工程属性菜单:

    0de03082645c40b74a53802cf6706359.png

    做这一步的目的是,增加对c++代码的支持,他会自动生成一些东西,你会看到多一个jni的文件夹。

    24dae8222dcd7f62fc0c0b9be34d70cf.png

    这个名字可以默认,就用工程的名字,实际上就是产生的c++代码生成.so文件的名称(windows上的dll文件).

    完成以后。可以看代码,生成一个HelloJni的.cpp文件。

    c5e422c6189e9616ee83d896b8ad5075.png

    我们可以在这个cpp中写c++代码了,当然你也可以增加其他的cpp,.h文件等。

    假设我们要实现一个函数返回一个一个字符串的功能,那么我们首先要在java中定义一个类。点击红圈的按钮会弹出添加类的对话框,

    我起的名字叫HelloJni.

    248709b91f75c737564d70277530e4d6.png

    package com.example.hellojni;public class HelloJni {//!增加一个函数 ,如下,public native String getString();}

    其实在java中要调用 c++,我们就做一个类,这个类用c++实现。实现代码不是写在java中的,而是写在c++中的。

    下面我们需要生成下.\

    f0f19a410eace9fdff49aabd45cdbec7.png

    可以不运行,然后到生成类的目录去:

    3a4af9f65105a45e552dc878f8c1f422.png

    我们在进入 就可以看到生成的.class文件了,如下图:但是我们需要回到classes目录:

    通过cmd命令行打开命令行窗口 :写如下命令:

    ac945aefc4b3adc52f82f63b6e0b02f7.png

    在这个文件夹下,你可以看到生成一个 .h文件。

    6828468651d87b298aa80bc2d4343f2d.png

    这个就是上面的HelloJni 类生成的对应的c++的函数原型,我们接下来要实现这个函数。将这个头文件copy到jni下:

    #include

    #include "com_example_hellojni_HelloJni.h"

    #ifdef __cplusplus

    extern "C" {

    #endif

    /*

    * Class:     com_example_hellojni_HelloJni

    * Method:    getString

    * Signature: ()Ljava/lang/String;

    */

    JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_getString

    (JNIEnv *env, jobject)

    {

    return env->NewStringUTF("Hello from JNI !");

    }

    #ifdef __cplusplus

    }

    #endif

    在MainActivity.java中调用HelloJni类的方法:

    代码如下:

    package com.example.hellojni;

    import android.os.Bundle;

    import android.app.Activity;

    import android.view.Menu;

    public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    HelloJni jni = new HelloJni();

    String sss = jni.getString();

    sss = "aaa";

    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;

    }

    }

    展开全文
  • <ul><li>电脑操作系统:Windows</li><li>手机系统:Android 8.1</li><li>相关模块:Service</li></ul> 现象 获取不到 ServerName , <p><code>Service.getServerName().then(res=>{ }).catch(err=>...
  • 作为 C/C++ 程序员,有时候我们希望在安卓上运行从 C/C++ 生成的可执行程序,而不是在 Java 中通过 jni 的方式来调用 C 动态库。有两个途径可以达到这个目的:一个是使用安卓 NDK 提供的工具链直接编译 C 代码(其中...

        作为 C/C++ 程序员,有时候我们希望在安卓上运行从 C/C++ 生成的可执行程序,而不是在 Java 中通过 jni 的方式来调用 C 动态库。有两个途径可以达到这个目的:一个是使用安卓 NDK 提供的工具链直接编译 C 代码(其中又有两种方式,使用 android 的 mk 文件,使用自己编写的 Makefile );一个是使用 Qt 5.2 for Android ,Qt Creator 可以生成安卓版本。这里我们说 Qt for Android,不说 NDK 方式。

        Qt for Android 的环境搭建,可以参考我之前的博文《Windows下Qt 5.2 for Android开发入门》。

        一旦你生成了一个项目,配置好了工具链,就可以在 Qt Creator 的项目标签中选择安卓版本进行编译。不过默认编译出来的是动态库, so 文件。而我们想要可执行程序。这个可以通过修改 Makefile 来完成,纯手动的方式有以下几个步骤:

    1. 修改 Makefile ,找到 LFLAGS 开始的那一行,去掉 -shared 和 -Wl,-soname,xxx.so 这两个链接选项,这杨链接器就会生成可执行程序
    2. 修改 Makefile ,找到 QMAKE_TARGET 和 TARGET 开始的两行,把 " = " 后面的目标修改为你想要的那个名字,假定为 xxx 
    3. 打开 Qt 5.2.0 for Desktop (MinGW 4.8 32 bit) ,进入你的安卓编译目录,执行 mingw32-make ,可以看见, xxx 生成了

        使用原生程序比使用 APK + JNI 方式会有一个好处: Java 虚拟机无法控制原生程序占用的内存,而 APK + JNI 的方式, C 代码和 Java 代码共享整个 Java 虚拟机的内存, C 代码会受到虚拟机内存大小的限制。

        如果嫌上面的步骤麻烦(每次 Qt 工程变化都要手动修改 Makefile ,比如往添加了文件等),可以在 Qt Creator 中给工程添加一个构建步骤(自动修改 Makefile ),顺序放在 qmake 之后,这样每次 qmake 生成了 Makefile ,自定义的构建步骤就会自动执行来修改 Makefile ,在 make 时应用修改,最终生成可执行文件。下图是我的一个工程的配置:


        至于怎么自动修改 Makefile ,可以使用一些开源的文本工具(如 sed for windows 等),这里就展开了。我是自己写了个小程序,专用的,不通用,也不提了。

    展开全文
  • windows和linux环境下java调用C++代码-JNI技术

    千次阅读 热门讨论 2017-09-20 15:52:54
    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结下,希望看到的以后...

    一.前言

     

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结下,希望看到的以后能少走弯路。

    使用工具:
    1.JAVA使用的IDE为eclipse
    2.windows环境下C++使用的IDE为visual studio 2010
    3.linux环境下C++使用的编译器为gcc/g++

     

    二.windows环境下java调用C++代码

     

    2.1新建java工程,生成相应头文件

    eclipse新建工程名为"jniDemo"的java工程,在包名为com.woniu.Native下新建"NativeCpp.java"类,如下:

     

    package com.woniu.Native;
    
    public class NativeCpp {
    	public native void fun1();
    	public native int  fun2(int a, int b);
    	public native void fun3(String url1, String url2);
    }

     

     

    编译生成.class文件

    进入工程下的target\classes目录下,执行"javah -jni com.woniu.Native.NativeCpp",运行结果如下:

     

     

    此时,会在classes目录下生成"com_woniu_Native_NativeCpp.h"头文件,头文件内容如下:

     

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_woniu_Native_NativeCpp */
    
    #ifndef _Included_com_woniu_Native_NativeCpp
    #define _Included_com_woniu_Native_NativeCpp
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_woniu_Native_NativeCpp
     * Method:    fun1
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_com_woniu_Native_NativeCpp_fun1
      (JNIEnv *, jobject);
    
    /*
     * Class:     com_woniu_Native_NativeCpp
     * Method:    fun2
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_com_woniu_Native_NativeCpp_fun2
      (JNIEnv *, jobject, jint, jint);
    
    /*
     * Class:     com_woniu_Native_NativeCpp
     * Method:    fun3
     * Signature: (Ljava/lang/String;Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_com_woniu_Native_NativeCpp_fun3
      (JNIEnv *, jobject, jstring, jstring);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

     

    2.2 c++生成动态库

    vs2010新建工程名为"JniDll"的win32控制台应用程序,win32应用程序向导界面选择 "DLL"

     

     

    创建完成后,把2.1中生成的"com_woniu_Native_NativeCpp.h"头文件放入该工程,并把头文件中的#include <jni.h>改为 "jni.h",
    把JDK下include文件夹下的"jni.h"和include下win32文件夹下的"jni_md.h"头文件也一同放入创建的工程中。

    工程目录如下:

     

     

    编辑JniDll.cpp源码文件,实现头文件中的函数,如下:

     

    /********************************************************
    Copyright (C), 2016-2017,
    FileName: 	jni
    Author: 	woniu201
    Email: 		wangpengfei.201@163.com
    Created: 	2017/09/20
    Description:Jni function
    ********************************************************/
    #include "stdafx.h"
    #include "com_woniu_Native_NativeCpp.h"
    #include "stdio.h"
    #include "stdlib.h"
    
    JNIEXPORT void JNICALL Java_com_woniu_Native_NativeCpp_fun1
    	(JNIEnv *, jobject)
    {
    	printf("hello world\n");
    }
    
    JNIEXPORT jint JNICALL Java_com_woniu_Native_NativeCpp_fun2
    	(JNIEnv *, jobject, jint a, jint b)
    {
    	return a + b;
    }
    
    char* jstringToChar(JNIEnv* env, jstring jstr) {
    	char* rtn = NULL;
    	jclass clsstring = env->FindClass("java/lang/String");
    	jstring strencode = env->NewStringUTF("GB2312");
    	jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
    	jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
    	jsize alen = env->GetArrayLength(barr);
    	jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
    	if (alen > 0) {
    		rtn = (char*) malloc(alen + 1);
    		memcpy(rtn, ba, alen);
    		rtn[alen] = 0;
    	}
    	env->ReleaseByteArrayElements(barr, ba, 0);
    	return rtn;
    }
    
    JNIEXPORT void JNICALL Java_com_woniu_Native_NativeCpp_fun3
    	(JNIEnv *env, jobject, jstring url1, jstring url2)
    {
    	//jstringתchar*
    	char* pUrl1 = jstringToChar(env, url1);
    	char* pUrl2 = jstringToChar(env, url2);
    	printf("url1 = %s\n", pUrl1);
    	printf("url2 = %s\n", pUrl2);
    }
    

     

    我本机是64位系统,使用的是64位JDK,这里生成的动态库也要生成64位的库,否则调用的时候报如下错误:

     

     

    更改vs编译生成64位dll,步骤如下:

     

     

     

    编译生成解决方案,这时候会在工程根目录下,生成"x64文件夹",Debug文件夹下会有动态库"JniDll.dll"

     

     

    2.3 java调用dll

    package com.woniu.jniDemo;
    
    import com.woniu.Native.NativeCpp;
    
    public class App 
    {
        public static void main( String[] args )
        {
        	System.load("D:\\VS2010\\VC\\JniDll\\x64\\Debug\\JniDll.dll");
        	NativeCpp nativeCpp = new NativeCpp();
            nativeCpp.fun1();
            System.out.println(nativeCpp.fun2(3, 3));
            nativeCpp.fun3("www.baidu.com", "www.haoservice.cn");
        }
    }


    运行结果如下:

     

     

     

    三.linux(CentOS)环境下java调用C++代码

     

    3.1 编译环境

    a.安装gcc和g++

      yum install gcc-c++


    b.安装jdk
      去官网上下载jdk安装包,建议使用rpm安装包,会自动配置环境变量。安装完后如下:

      本机的安装目录为:/usr/java/jdk1.8.0_144/,不同版本可能不同。


      这里一定要注意不能安装openjdk,因为openjdk没有include目录,编译时需要用到include目录的头文件。
     

    3.2 制作动态库(so库)

    a.创建文件夹"jniso",mkdir jniso。


    b.把2.1中生成的头文件"com_woniu_Native_NativeCpp.h"拷贝过来,#include "jni.h"改为#include <jni.h>


    c.新建jni.cpp源文件,添加如下代码:

     

    #include <jni.h>
    #include "com_woniu_Native_NativeCpp.h"
    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    
    JNIEXPORT void JNICALL Java_com_woniu_Native_NativeCpp_fun1 (JNIEnv *, jobject)
    {
            printf("hello world\n");
    }
    
    JNIEXPORT jint JNICALL Java_com_woniu_Native_NativeCpp_fun2
            (JNIEnv *, jobject, jint a, jint b)
    {
            return a + b;
    }
    
    char* jstringToChar(JNIEnv* env, jstring jstr) {
            char* rtn = NULL;
            jclass clsstring = env->FindClass("java/lang/String");
            jstring strencode = env->NewStringUTF("GB2312");
            jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
            jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
            jsize alen = env->GetArrayLength(barr);
            jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
            if (alen > 0) {
                    rtn = (char*) malloc(alen + 1);
                    memcpy(rtn, ba, alen);
                    rtn[alen] = 0;
            }
            env->ReleaseByteArrayElements(barr, ba, 0);
            return rtn;
    }
    
    JNIEXPORT void JNICALL Java_com_woniu_Native_NativeCpp_fun3
            (JNIEnv *env, jobject, jstring url1, jstring url2)
    {
            char* pUrl1 = jstringToChar(env, url1);
            char* pUrl2 = jstringToChar(env, url2);
            printf("url1 = %s\n", pUrl1);
            printf("url2 = %s\n", pUrl2);
    }


    d.编译,生成动态库
    g++ -fPIC -c jni.cpp -I /usr/java/jdk1.8.0_144/include/ -I /usr/java/jdk1.8.0_144/include/linux/
    g++ -shared jni.o -o jni.so

     

    3.3 java调用jni.so

    import com.woniu.Native.NativeCpp;
    
    public class App 
    {
        public static void main( String[] args )
        {
        	//windows环境下加载库
        	//System.load("D:\\VS2010\\VC\\JniDll\\x64\\Debug\\JniDll.dll");
        	
        	//linux下加载库
        	System.load("/mnt/hgfs/svn/svn/Demo/jniso/jni.so");
        	
        	NativeCpp nativeCpp = new NativeCpp();
            nativeCpp.fun1();
            System.out.println(nativeCpp.fun2(3, 3));
            nativeCpp.fun3("www.baidu.com", "www.haoservice.cn");
        }
    }
    


    运行结果如下:

     

     

     

    windows下生成dll源码地址:点击打开链接

    没有下载积分的,可以关注下面公众号,回复"105"获取源码

    linux下生成so动态库源码地址:点击打开链接

    没有下载积分的,可以关注下面公众号,回复"106"获取源码

     

    展开全文
  • 目的:windows平台下的c++算法,需要移植到安卓系统上。平时用惯了Visual Studio,再在其他软件上重新写算法,调试算法,实在头疼。所以我用VS的c++移动开发功能创建动态共享库,将算法内容放入,并实现JNI和JAVA...
  • 最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结下,希望看到的以后...
  • (给安卓开发精选加星标)转自:IT之家外媒 Windows Latest 报道,微软正在开发一个新项目,通过支持原生运行安卓 App,以弥补微软商店(也称 Windows 商店)中的 “应用空白”。IT之家获悉,关于在 Windows 10 上原生...
  • OpenCV for Unity 2.3.3-1,支持安卓,IOS,Windows,WebGL,Linux,MacOS,可以在Unity3D中调用OpenCV的接口,包含多个平台的对接
  • 一、使用方法(需要python环境) 1、把server.py文件放于d:\\盘根目录。 2、下载android-sdk-windows,并确保tools文件夹下有...4、启动安卓设备,并使用adb连接好。 5、运行ui.py,点击按钮测试吧!   --------
  • string useragent = HttpContext.Request.Headers["User-Agent"].ToString(); string[] keywords = { "Android", "iPhone", ...useragent.Contains("Windows NT") && !useragent.Contains("Macintosh")) ...
  • 接着上一节 ,很多事情用java做,效率要差一点(尤其是游戏),所以要用c++来实现,那么java如何调用c++首先建议一个工程 HelloJni如下图:按照默认的配置下一步,直到完成 。如下图操作,点击windows菜单-》Prefrence...
  • 接着上一节 ,很多事情用java做,效率要差一点(尤其是游戏),所以要用c++来实现,那么java如何调用c++ 首先建议一个工程 HelloJni如下图: 按照默认的配置下一步,直到完成 。 如下图操作,点击windows...
  • 最近用到了Cocos2dx,3.17,...先说一下具体环境,使用的是,Windows10 + AndroidStudio3.2.1 + CMake去官网下载cocos2dx3.17,https://www.cocos.com/download1、创建新项目cocos2dx3.x使用python2.7,命令行方式...
  • 安卓模拟器

    2018-05-24 11:24:45
    BlueStacks [1] 是一个...BlueStacks新版本App Player采用名为Layercake的技术,可以让针对ARM处理器开发的安卓应用运行在基于x86处理器的PC或者平板上,而且可以调用PC的显卡,能提供比Alpha版本更加平滑的体验。
  • Java实现安卓压力测试

    2018-04-27 01:27:46
    原理:用Java调用Windows Command命令 -> Windows Command调用安卓SDK的ADB命令 -> ADB命令调用monkey。  优点:通过Java代码来实现monkey的功能,可以把脚本部署到持续监控平台完成,无需人工运行。代码
  • 比如数据库的调用,当我们下载一个JDBC的jar包之后,解压可以看到里面包含了不同平台的动态链接库: 这篇文章介绍如何为Android,Mac和Windows平台,创建一个最简单的JNI动态链接库。参考文章:Android下...
  • EasyPusher-Android:实时采集安卓摄像头音视频(Android 5.0+支持采集手机桌面屏幕进行直播),进行H.264/AAC编码后,调用EasyPusher进行直播推送,项目地址:https://github.com/EasyDarwin/EasyPusher-Android ;...
  • 一直想用语音来控制老控制家电等设备,但是目前sdk只有js和安卓版的。没有c++或者java版,所以开发集成起来不是很方便,遂下载了安卓版的sdk抽离出java版的sdk.只是代码简陋略有粗糙,但是基本功能已经实现。git地址...
  • 电脑安卓模拟器

    2013-10-03 15:09:05
     BlueStacks新版本App Player采用名为Layercake的技术,可以让针对ARM处理器开放的安卓应用运行在基于x86处理器的PC或者平板上,而且可以调用PC的显卡,能提供比Alpha版本更加平滑的体验。  新浪提示:需要至少1GB...
  • 安卓简单QQ

    2017-01-22 12:58:32
    操作系统:Windows 10 数据库系统:SQLite 项目版本控制:GitHub 、Git 2.9.2 开发工具:IntelliJ IDEA 2016.1.4 开发语言:Java (JDK 1.8.0_45) 运行环境:Android 4.4及以上 2. 系统需求分析 SimpleQQ软件希望...
  • 桌面 安卓模拟器

    2018-10-23 08:28:45
    lueStacks蓝叠安卓模拟器是一个可以让Android应用程序能运行在Windows系统上的软件,可以调用PC的显卡,采取目前最先进的HyperDroid技术,能使很多热门的游戏(天天酷跑,天天飞车等)在电脑上玩,拥有屏幕更大,不...
  • 让Hyper-v与安卓虚拟机共存

    千次阅读 2020-03-10 14:52:43
    我们都知道在windows下,如果使用Docker,需要安装Hyper-v,但是此时再调用安卓虚拟机的话,会显示冲突,而是用第三方(比如夜神)就直接蓝屏了。这就导致两者不能同时使用。 最优解 现在微软给出了一个解决方案。在...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 161
精华内容 64
关键字:

windows调用安卓