看起来CallStaticObjectMethod,CallObjectMethodMethod和等...都是你所需要的.根据文件
CallNonvirtual<type>Method惯例的Call<type>Method家庭和惯例的家庭是不同的.Call<type>Method例程根据对象的类CallNonvirtual<type>Method调用方法,而例程根据clazz参数指定的类调用方法,从中获取方法ID.方法ID必须从对象的真实类或其超类之一获得.
从该描述中也可以看出具体方法CallNonvirtualObjectMethod没有用处.
我正试图用我的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) 我有一个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) 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) 我试图解决从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) 我试图从参考链接实现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) 我想知道是否可以使用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())的对象,我必须动态且全局地执行此操作,而无需类名
我正在使用一个使用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(),所以我无法释放"数据",这会造成内存泄漏.
我正在将我们的游戏从使用ndk-build转换为使用Android Studio和CMake。
该应用程序是采用以下形式的JNI应用程序:
Java主要活动(单个非常基本的.java文件)
C ++应用程式码(游戏程式码)
C ++物理代码(要编译并链接为静态库)
C ++图形代码(要编译并链接为静态库)
这3个文件被编译到一个共享的.so lib中,以由main活动加载和运行。
如何将其转换为gradle构建文件和cmakelist?
我看过很多示例,它们只是链接到外部静态库中,没有用。我也需要编译它们,并且希望它们显示在项目视图中,以便我可以编辑源代码。
如果我也可以将静态库的“项目”也放到其他应用程序中,同时保留编辑这些库的源代码的能力(类似于Visual Studio项目文件),那也很好。
这可能吗?
非常感谢,
史蒂夫。
需要将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
怎么解决?