我只是搞乱了我发现的Ndk教程。本机代码使用一个“包”,而活动在另一个中。当发生这种不匹配时,如果没有得到不满意的链接异常,我就无法调用本机函数。我知道“为什么”我只是不知道决议。
以下是我放在jni文件夹中的示例.c代码:
#include <string.h>
#include <jni.h>
jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
return (*env)->NewStringUTF(env, "Hello from native code!");
}
请注意,此.c代码的包转换为com.mindtherobot.samples.ndkfoo.NdkFooActivity
。
如果我创建一个与该Package / Class匹配的新活动,我可以调用invokeNativeFunction
就好了。但是,如果我无法匹敌呢?如果我需要从com.mydomain.activity运行它会怎么样?
我想我可以改变一些事情,这样我的原生宣言就像这样:
package com.mydomain;
public class Activity {
private native String com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction();
}
但那是不行的。为了清楚起见,如果我改变我的包以匹配.c代码中编译的包,我知道如何使这个工作;但是,我需要能够从不同的包调用一个方法......这可能吗?
答案 0 :(得分:2)
您需要创建一个基本类,其唯一功能是与C交谈,而不是活动。然后,只要需要与C通信,活动就可以实例化这个类,甚至可以静态地调用它。
答案 1 :(得分:0)
您的问题非常混乱,但Java源代码中的包声明必须与编码到本机方法名称的内容一致,即它必须与javah生成的内容一致。如果更改Java代码中的包,则必须重新生成.h文件,并调整.c文件以适应。除此之外别无选择。