标签: java-native-interface

何时使用CallNonvirtualObjectMethod及其相关方法?

看起来CallStaticObjectMethod,CallObjectMethodMethod和等...都是你所需要的.根据文件

CallNonvirtual<type>Method惯例的Call<type>Method家庭和惯例的家庭是不同的.Call<type>Method例程根据对象的类CallNonvirtual<type>Method调用方法,而例程根据clazz参数指定的类调用方法,从中获取方法ID.方法ID必须从对象的真实类或其超类之一获得.

从该描述中也可以看出具体方法CallNonvirtualObjectMethod没有用处.

c++ java java-native-interface

1
推荐指数
1
解决办法
559
查看次数

Android JNI网桥Toast C++无法正常工作 - 如何解决?

我正试图用我的hpp单元解决一个小问题.我在互联网上发现了一些例子,展示了如何使用Android JNI桥在屏幕上烘烤信息,但它只是在pascal(delphi)中,所以我决定使用相同的pas文件但是使用hpp文件进行转换.直到现在我明白了:

#ifndef Android_Jni_ToastHPP
#define Android_Jni_ToastHPP

#pragma delphiheader begin
#pragma option push
#pragma option -w-                                        // All warnings off
#pragma option -Vx                                        // Zero-length empty class member 
#pragma pack(push,8)
#include <FMX.Helpers.Android.hpp>                        // Pascal unit
#include <Androidapi.JNIBridge.hpp>                       // Pascal unit
#include <Androidapi.JNI.JavaTypes.hpp>                   // Pascal unit
#include <Androidapi.JNI.GraphicsContentViewText.hpp>     // Pascal unit
#include <Androidapi.JNI.Util.hpp>                        // Pascal unit
#include <Androidapi.JNI.App.hpp>                         // Pascal unit
#include <FMX.Surfaces.hpp>                               // Pascal unit

//-- user supplied -----------------------------------------------------------

namespace Android
{
namespace Jni
{
namespace Toast
{
//-- type declarations …
Run Code Online (Sandbox Code Playgroud)

c++ delphi java-native-interface c++builder c++builder-xe7

1
推荐指数
1
解决办法
1541
查看次数

如何从C文件函数(Java Native Interface)中仅调用Java的返回值

我有一个Java文件,它声明了我的C文件中定义的本机方法average().该方法取两个数的平均值,打印"在C中,数字为n1,n2"(n1和n2为输入数字),并将平均值作为double返回.

然后Java文件调用average()方法,打印"在Java中,平均值为(n1 + n2)/ 2",然后打印平均值x 2.

以下是数字3和2(运行我的Java文件)的示例:

在C中,数字是3和2

在Java中,平均值为2.5

在C中,数字是3和2

5

我想只将C文件的返回值(平均值)乘以2.我不希望字符串"在C中,数字是3和2"再次打印.如何仅从C文件中打印返回值(平均值)而不再打印字符串"在C中,数字为3和2"?我知道我可以创建另一种方法,但这将是非常重复的.

我的Java文件如下:

public class TestJNIPrimitive {

    static {
        System.loadLibrary("myjni"); //myjni.dll (Windows)
    }

    private native double average(int n1, int n2);
    public static void main(String args[]) {

        System.out.println("In Java, the average is " + new TestJNIPrimitive().average(3,2));
        double result = new TestJNIPrimitive().average(3,2);
        System.out.println(result*2);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的C文件如下:

JNIEXPORT jdouble JNICALL Java_TestJNIPrimitive_average(JNIEnv *env, jobject thisObj, jint n1, jint n2) {

    printf("In C, the numbers are %d and %d\n", n1, n2);
    jdouble result;
    result = …
Run Code Online (Sandbox Code Playgroud)

c java methods java-native-interface return

1
推荐指数
1
解决办法
458
查看次数

返回JNI从本机方法创建的本地引用

JNI参考说明了这一点

"本地引用在本机方法调用的持续时间内有效.它们在本机方法返回后自动释放.

资料来源:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#global_local

我有点迷失在这里.根据上面,我必须显式调用NewGlobalRef并传递从调用NewObject的对象返回的对象.我尝试了这个,似乎当GC启动时,它不会收集我的引用(就像仍然保留它们的东西).考虑以下项目: Main.java:

package lv.example;

import java.io.IOException;
import java.util.ArrayList;

class Main {

    public static void main(String[] args) {
        ArrayList<Object> store = new ArrayList<Object>();
            while(true) {
                Object d = null;
                try {
                    int c = System.in.read();
                    d = Dummy.getWeakGlobalRef();
                    if(c == 'c')
                        store.clear();
                    store.add(d);
                    System.out.println(d);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

    }

}
Run Code Online (Sandbox Code Playgroud)

Dummy.java:

package lv.example;

class Dummy {

    static {

        System.loadLibrary("dummy");
    }
       native static Dummy getLocalRef();
       native …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface garbage-collection jnienv

1
推荐指数
1
解决办法
2901
查看次数

使用许多不同种类的表情符号和语言时,对C ++ JNI NewStringUTF的调用会使android应用程序崩溃(除了ascii,但仍然是有效的修改版utf-8)

我试图解决从Android 5.x上的Cocos2d-x键盘输入崩溃的问题,这是因为我从带有在键盘上找到的许多表情符号的文本创建CCImage的(尽管有些工作,但是大多数却没有。)在Android 4.x上,设备仅显示乱码的文本/其他字符。崩溃的根源是JNI的NewStringUTF()调用。它根本不支持Android 5 / Lollipop中的所有2、3、4字节utf-8字符。

此崩溃发生在使用带有工具链4.8的NDK 10e的cocos2d-x v2.2.6(并在3.x上得到确认)(不确定其中是否有太大的不同,我们在使用Android Studio和I之前使用了9d)可以肯定我们遇到了这个问题,但棒棒糖的使用量却少得多。)

如果您从不按任何未经修改的utf-8符号(即坚持使用ascii),则可能永远不会看到此问题。

Log Cat:
    12-11 01:02:17.460 10451-10959/com.appsomniacs.da2.debug A/art: sart/runtime/check_jni.cc:65]     string: ''
    12-11 01:02:17.460 10451-10959/com.appsomniacs.da2.debug A/art: sart/runtime/check_jni.cc:65]     in call to NewStringUTF
    12-11 01:02:17.460 10451-10959/com.appsomniacs.da2.debug A/art: sart/runtime/check_jni.cc:65]     from void org.cocos2dx.lib.Cocos2dxHelper.nativeSetEditTextDialogResult(byte[])
    12-11 01:02:17.460 10451-10959/com.appsomniacs.da2.debug A/art: sart/runtime/check_jni.cc:65] "GLThread 45716" prio=5 tid=14 Runnable
    12-11 01:02:17.460 10451-10959/com.appsomniacs.da2.debug A/art: sart/runtime/check_jni.cc:65]   | group="main" sCount=0 dsCount=0 obj=0x12c0c6c0 self=0xf442bc00
    12-11 01:02:17.460 10451-10959/com.appsomniacs.da2.debug A/art: sart/runtime/check_jni.cc:65]   | sysTid=10959 nice=0 cgrp=default sched=0/0 handle=0xf450c380
    12-11 01:02:17.460 10451-10959/com.appsomniacs.da2.debug A/art: sart/runtime/check_jni.cc:65]   | state=R schedstat=( 0 0 0 …
Run Code Online (Sandbox Code Playgroud)

c++ java-native-interface android utf-8 cocos2d-x

1
推荐指数
1
解决办法
5652
查看次数

java.lang.UnsatisfiedLinkError:com.android.tools.fd.runtime.IncrementalClassLoader

我试图从参考链接实现Android-FFmpeg-Images-Video android studio项目示例.

当我尝试运行Android应用程序然后在这里它会给出错误

java.lang.UnsatisfiedLinkError:com.android.tools.fd.runtime.IncrementalClassLoader $ DelegateClassLoader nativeLibraryDirectories = [/ data/data/com.catcry.ffmpeg/lib,/ vendor/lib,/ system/lib]]]找不到"libffmpeg-jni.so"

static {
    System.loadLibrary("ffmpeg");
    System.loadLibrary("ffmpeg-jni");
}
Run Code Online (Sandbox Code Playgroud)

这是我的build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.0"

defaultConfig {
    applicationId "com.example.ffmpeg"
    minSdkVersion 14
    targetSdkVersion 23
    multiDexEnabled true
}

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
sourceSets {
    main {
        res.srcDirs = ['src/main/res']
        jniLibs.srcDirs = ['src/main/jniLibs']
        jni.srcDirs = [] // This prevents the auto generation of Android.mk
    }
}
}

dependencies {
compile 'com.android.support:support-v4:23.0.0' …
Run Code Online (Sandbox Code Playgroud)

java-native-interface android ffmpeg

1
推荐指数
1
解决办法
1万
查看次数

JNI,如何列出所有当前实例?

我想知道是否可以使用JNI api列出当前JVM中的所有当前可用实例(作为jobject)。

我的意思示例:

jvm->AttachCurrentThreadAsDaemon((void**)&env,0);
jobject* instances;
int count = env->GetInstances(&instances);
Run Code Online (Sandbox Code Playgroud)

我的任务是在它们中搜索实现特定interface(env->IsInstanceOf())的对象,我必须动态且全局地执行此操作,而无需类名

c++ java java-native-interface

1
推荐指数
1
解决办法
770
查看次数

有没有什么方法可以释放生成的java代码中的内存来通过JNI/JNA绑定C代码?

我正在使用一个使用JNA绑定到原始C库的Java库(该库名为Leptonica).我遇到了一种情况,必须在C代码中调用free(data)来释放内存.但是,java中是否有任何可以释放内存的功能?

在C代码中

void ImageData::SetPixInternal(Pix* pix, GenericVector<char>* image_data) {
  l_uint8* data;
  size_t size;
  pixWriteMem(&data, &size, pix, IFF_PNG);
  pixDestroy(&pix);
  image_data->init_to_size(size, 0);
  memcpy(&(*image_data)[0], data, size);
  free(data);
}
Run Code Online (Sandbox Code Playgroud)

函数pixWriteMem()将为"数据"创建和分配内存,您需要自由(数据)以便以后释放内存.

在Java代码中,我只能访问pixWriteMem(),而不能访问SetPixInternal(),所以我无法释放"数据",这会造成内存泄漏.

c java java-native-interface memory-leaks jna

1
推荐指数
1
解决办法
819
查看次数

如何创建具有多个静态库的JNI Android Studio项目

我正在将我们的游戏从使用ndk-build转换为使用Android Studio和CMake。

该应用程序是采用以下形式的JNI应用程序:


Java主要活动(单个非常基本的.java文件)

C ++应用程式码(游戏程式码)

C ++物理代码(要编译并链接为静态库)

C ++图形代码(要编译并链接为静态库)


这3个文件被编译到一个共享的.so lib中,以由main活动加载和运行。

如何将其转换为gradle构建文件和cmakelist?

我看过很多示例,它们只是链接到外部静态库中,没有用。我也需要编译它们,并且希望它们显示在项目视图中,以便我可以编辑源代码。

如果我也可以将静态库的“项目”也放到其他应用程序中,同时保留编辑这些库的源代码的能力(类似于Visual Studio项目文件),那也很好。

这可能吗?

非常感谢,

史蒂夫。

java java-native-interface android native android-ndk

1
推荐指数
1
解决办法
913
查看次数

Java将ArrayList转换为C#

需要将Java ArrayList转换为C#ArrayList.

这是行不通的.

//code in C#
public void DoSomething(Java.Lang.Object obj){
    Java.Util.ArrayList list = (Java.Util.ArrayList) obj;
}
Run Code Online (Sandbox Code Playgroud)

例外情况:

未处理的异常:

System.InvalidCastException:指定的强制转换无效.

当我打印出来时obj.Class,它会返回class java.util.ArrayList

怎么解决?

c# java java-native-interface

1
推荐指数
1
解决办法
468
查看次数