Skip to main content
Associate
September 22, 2026
Solved

ST25SDK iOS – J2ObjC 2.4 vs 3.1 Compatibility Confirmation

Issue

I am working on an iOS application that uses the ST25SDK for NFC operations.

The ST25SDK documentation indicates that the iOS SDK is based on J2ObjC 2.4. I downloaded the J2ObjC 2.4 source and attempted to build it locally on an Apple Silicon Mac.

However, I am currently unable to complete the J2ObjC 2.4 build. I have also tested J2ObjC 3.1, which builds successfully in the same environment.

Question

Could you please confirm whether J2ObjC 3.1 is supported/compatible with the ST25SDK iOS version I am using, or whether the application must specifically use J2ObjC 2.4?

In particular, I would like to clarify:

  1. Is J2ObjC 2.4 a strict requirement for the ST25SDK iOS Objective-C sources?

  2. Can J2ObjC 3.1 be used as a drop-in replacement if it successfully builds?

  3. If J2ObjC 3.1 is not compatible, are there any required patches or source changes that would allow the ST25SDK to work with J2ObjC 3.1?

  4. Is there an official/prebuilt J2ObjC 2.4 distribution recommended for the current ST25SDK, so that building J2ObjC 2.4 from source can be avoided?

Environment

  • macOS: Apple Silicon

  • Xcode: 26.2

  • J2ObjC 2.4: source build currently failing

  • J2ObjC 3.1: source build successful

  • Java: JDK 11

  • Protobuf: 36.2

The main concern is avoiding an unsupported J2ObjC version in the ST25SDK integration. I would therefore like confirmation from ST before proceeding with J2ObjC 3.1.

victor laraison
victor laraisonBest answer
ST Employee
September 30, 2026

4. Looking at the framework's umbrella header
“Is the umbrella header intentionally exposing only a subset of the SDK headers, or should all public SDK headers be available through st25sdkFramework.h?”
=> st25sdkFramework.h intentionally exposes only the main ST25SDK and J2ObjC headers needed by your app. You should also configure the ST25SDK and J2ObjC search paths in your project settings.

5. Looking at the NFC Tap sample application
“If st25sdkFramework.framework is provided as the prebuilt framework, why does the NFC Tap sample project also contain libST25SDK.a?

I would like to understand the purpose of this static library and how it relates to the prebuilt framework.”
=> No, STSW-ST25IOS002 is different. It includes the full ST25SDK header files and the static library libst25SDK.a, but it does not contain ST25SDK.framework.
I suggest you take a look at the sample application STSW-ST25IOS005, which uses st25sdkframework.


6. My current experiment
Your approach is quite good. it shows initiative and a good understanding of how the SDK is structured. However, it is not necessary.

The main issue is that you started from a setup that was originally using the static library and tried to move it to st25sdkFramework. The framework integration should be used as provided, without manually re-adding headers or excluding .m files from the SDK sources.

Please refer to the STSW-ST25IOS005 sample application, which is the correct example for using st25sdkFramework.

Question 1 — Why is libST25SDK.a present?
Please, ref  to STSW-ST25IOS005 sample application where only st25sdkFramework is present and no libST25SDK

Question 2
 — Do I actually need to build J2ObjC 2.4?

No, you do not need to build J2ObjC 2.4 if you are using st25sdkframework directly.

The framework already includes the required headers and the embedded libraries, so no additional J2ObjC build step is needed.

Question 3 — What is the correct integration process?

1. Add st25sdkFramework.framework
2. Add/embed the framework in the application
3. Configure the required framework/header search paths

Question 4 — Are my current steps valid?
Not needed if you use the st25sdkframework directly.

Question 5 — What is the purpose of the SDK .m files?

These .m files are not needed when you integrate the prebuilt st25sdkFramework directly.

If the framework is already provided, its implementation is already compiled inside it, so the .m files from the sample’s include folder should be ignored. Their presence in the NFC Tap sample looks like a leftover or an artifact from the original development setup, where the project used the static library flow.

So, for the prebuilt framework integration:

  • use the framework,
  • keep the required .h headers,
  • do not compile the SDK .m files separately.

Question 6 — What is the correct way to access headers that are not in the umbrella header?

Yes, you can add them manually to the umbrella header.

If some SDK headers such as Type1Command.h or Type1Tag.h are part of the SDK but not exposed by st25sdkFramework.h, adding the missing imports manually is a valid workaround to make those APIs visible in your project.

That said, if you are using the prebuilt framework as intended, the recommended approach is to rely on the headers already exposed by the framework sample and use the same integration pattern as in STSW-ST25IOS005.

8. What I am ultimately trying to understand

Yes — if you use the prebuilt st25sdkFramework.framework, you do not need to build J2ObjC 2.4 separately. The prebuilt framework already contains the required J2ObjC pieces.

As for the NFC Tap sample: it contains libST25SDK.a and the st25sdklib/include source files because that sample was built around the static library integration flow, not the prebuilt framework flow. In other words, it reflects a different packaging/setup and is not the same integration model as st25sdkFramework.framework.

So the short answer is:

  • Prebuilt framework: self-contained, no separate J2ObjC 2.4 build needed.
  • NFC Tap sample: uses the static-library-based structure, which is why you see libST25SDK.a and the source/include files.


Thank you for your interest and for your detailed questions. I hope the explanations provided have been clear and helpful.​​​​​​​
 

3 replies

victor laraison
ST Employee
September 29, 2026

Hi ,
 

J2ObjC 3.1 is fully compatible with ST25SDK.

Could you please let us know which version of the ST25SDK you are currently using? This will help us check why it is not working in your case with J2ObjC 2.4.

It is also possible that the ST25SDK package you are using was already generated with J2ObjC 3.1, which could explain the behavior you are seeing.

Thx and Br

YatharthAuthor
Associate
September 30, 2026

Hi,

Thank you for the reply.

I am trying to integrate the ST25 SDK into a fresh iOS project, and I would like to confirm whether I am following the correct integration approach.

I will explain what I tried step by step, because there are a few things that I am currently confused about.

1. Why I initially tried to build J2ObjC 2.4

 

Initially, I was trying to build J2ObjC 2.4 myself.

The reason is that, while going through some older ST25 SDK forum discussions, I noticed that the ST25 SDK was built using J2ObjC 2.4, and there were also discussions mentioning that using a different/newer J2ObjC version could introduce compatibility issues or breakages with the ST25 SDK.

Because of this, I assumed that I specifically needed to build and use J2ObjC 2.4.

However, I am having problems building J2ObjC 2.4 in my current environment.

The environment has changed compared with when those older instructions were written. For example, the current macOS environment requires Python 3, whereas some of the older build instructions/environment expected a different Python setup.

I also encountered issues with some of the Maven dependencies/URLs used during the J2ObjC build. Some of the Maven URLs were using HTTP instead of HTTPS, which is also causing problems in the current macOS environment and ultimately resulting in the J2ObjC build failing.

So, because of these environment-related issues, I started looking for an alternative to building J2ObjC myself.

2. Trying the prebuilt ST25 SDK framework

I then came across an older ST25 community discussion where it was suggested to use the prebuilt framework instead.

Based on that discussion, my understanding was that if I use the prebuilt st25sdkFramework.framework, I should not need to separately build/install J2ObjC because the required implementation should already be included in the framework.

So I downloaded:

STSW-ST25IOS005 – iOS app 'NFC Tap' SDK Framework (Source)
Version: 1.6.0

After extracting it, I found a Frameworks folder containing:

Frameworks/
st25sdkFramework.framework

My assumption was that this framework contains the required ST25 SDK headers and implementation and that no additional SDK source compilation should be required.

3. Adding the prebuilt framework to a new project

I created a completely new iOS project and added:

st25sdkFramework.framework

to the project's Build Phases.

I also added the following Header Search Paths:

$(PROJECT_DIR)/Frameworks/st25sdkFramework.framework/Headers/Jre
$(PROJECT_DIR)/Frameworks/st25sdkFramework.framework/Headers

However, when I tried to import/use st25sdkFramework in my source code, the compiler was unable to find some of the SDK headers, for example:

STRegister.h

The build also did not work when I made the header search path recursive.

The only way I could get the compiler to find the required headers was to manually add a large number of individual header search paths.

I did not want to follow this approach because it does not seem like the intended way to consume a prebuilt framework.

4. Looking at the framework's umbrella header

I also noticed that the framework contains an umbrella header:

st25sdkFramework.h

However, it appears that only a limited set of SDK headers are exposed through this umbrella header.

For example, I needed APIs related to Type 1 tags, but the corresponding headers were not exposed.

I therefore had to add the following manually to st25sdkFramework.h:

#import "Type1Command.h"
#import "Type1Tag.h"

After adding those imports, I was able to access the corresponding APIs.

This raised another question for me:

Is the umbrella header intentionally exposing only a subset of the SDK headers, or should all public SDK headers be available through st25sdkFramework.h?

5. Looking at the NFC Tap sample application

Since the framework approach was not completely clear to me, I then looked at the source of the NFC Tap sample application:

STSW-ST25IOS002 – iOS app 'NFC Tap' for ST25 product family (Source)
Version: 7.10.0

In this project, I noticed a folder called:

st25sdklib

Inside it there is an include folder containing the SDK .h and .m files.

I also found:

libST25SDK.a

which, as I understand it, is a static library containing the compiled SDK implementation.

This is where I became particularly confused.

If st25sdkFramework.framework is provided as the prebuilt framework, why does the NFC Tap sample project also contain libST25SDK.a?

I would like to understand the purpose of this static library and how it relates to the prebuilt framework.

6. My current experiment

For testing, I tried another approach based on what I found in the NFC Tap sample.

I did the following:

  1. Removed libST25SDK.a.

  2. Copied the include folder from the sample project into my new project.

  3. Added the SDK header files to my project.

  4. Excluded all the SDK .m files from Compile Sources.

  5. Continued using the prebuilt st25sdkFramework.framework.

  6. Added the missing headers to the framework's umbrella header where necessary.

After doing this, I am now able to access the APIs that are present in the include folder.

However, I am not sure whether this is actually a correct integration method or whether I am unintentionally bypassing some required part of the SDK.

7. My main questions

I would like to clarify the following points.

Question 1 — Why is libST25SDK.a present?

If st25sdkFramework.framework is the recommended prebuilt framework, why does the NFC Tap sample project also contain:

libST25SDK.a

Is this static library:

  • an alternative to st25sdkFramework.framework?

  • used only when building the SDK from source?

  • an older integration mechanism?

  • required by the sample application for some other reason?

In other words, if I am using the prebuilt framework, do I need libST25SDK.a at all?

Question 2 — Do I actually need to build J2ObjC 2.4?

This is my most important question.

I initially started trying to build J2ObjC 2.4 because the older ST25 SDK discussions indicate that the SDK was built using J2ObjC 2.4 and that using another J2ObjC version could cause compatibility issues.

However, if I am using the prebuilt st25sdkFramework.framework, does that mean I can completely avoid building/installing J2ObjC 2.4?

In other words, does the prebuilt framework already contain the J2ObjC-generated/compiled implementation and the required J2ObjC runtime/JRE components?

If so, I assume there is no reason for me to go through the trouble of building J2ObjC 2.4 manually in my current environment.

Question 3 — What is the correct integration process?

For a completely fresh iOS project, is the intended process simply something like:

1. Add st25sdkFramework.framework
2. Add/embed the framework in the application
3. Configure the required framework/header search paths
4. Import the required ST25 SDK headers
5. Use the SDK APIs

Or are there additional libraries, source files, generated files, or J2ObjC components that must also be compiled or linked manually?

Question 4 — Are my current steps valid?

Is the following approach valid?

st25sdkFramework.framework
+
headers from st25sdklib/include
+
SDK .m files excluded from Compile Sources

Or should I not copy the include folder at all when using the prebuilt framework?

I want to make sure I am not accidentally creating an unsupported hybrid integration.

Question 5 — What is the purpose of the SDK .m files?

The include folder in the NFC Tap sample contains both .h and .m files.

If the prebuilt framework already contains the compiled implementation, should these .m files be completely ignored when integrating the prebuilt framework?

Or are some of them expected to be compiled separately?

Question 6 — What is the correct way to access headers that are not in the umbrella header?

If headers such as:

#import "Type1Command.h"
#import "Type1Tag.h"

are part of the SDK but are not included in:

st25sdkFramework.h

should I manually add them to the umbrella header?

Or is there another recommended way to expose/use these APIs without modifying the framework?

8. What I am ultimately trying to understand

My main goal is to understand the official/intended integration method for using the prebuilt st25sdkFramework.framework in a completely new iOS project.

Initially, I was trying to build J2ObjC 2.4 because the older ST25 SDK discussions made it appear that this specific J2ObjC version was required, and that using a different version could cause compatibility issues.

However, after finding the prebuilt st25sdkFramework.framework, I am wondering whether building J2ObjC 2.4 is actually unnecessary.

So, essentially, I would like to confirm the following:

If I use the prebuilt st25sdkFramework.framework, do I need to build J2ObjC 2.4 at all, or does the prebuilt framework already contain everything required from J2ObjC?

And separately:

Why does the NFC Tap sample contain libST25SDK.a and the st25sdklib/include source files if the prebuilt framework is supposed to be self-contained?

I would really appreciate it if someone could clarify the intended relationship between:

J2ObjC 2.4
↓
ST25 SDK source / generated code
↓
libST25SDK.a
↓
st25sdkFramework.framework

and provide the recommended steps for integrating the ST25 SDK into a fresh iOS project using the prebuilt framework.

Thanks in advance for the clarification.

victor laraison
victor laraisonBest answer
ST Employee
September 30, 2026

4. Looking at the framework's umbrella header
“Is the umbrella header intentionally exposing only a subset of the SDK headers, or should all public SDK headers be available through st25sdkFramework.h?”
=> st25sdkFramework.h intentionally exposes only the main ST25SDK and J2ObjC headers needed by your app. You should also configure the ST25SDK and J2ObjC search paths in your project settings.

5. Looking at the NFC Tap sample application
“If st25sdkFramework.framework is provided as the prebuilt framework, why does the NFC Tap sample project also contain libST25SDK.a?

I would like to understand the purpose of this static library and how it relates to the prebuilt framework.”
=> No, STSW-ST25IOS002 is different. It includes the full ST25SDK header files and the static library libst25SDK.a, but it does not contain ST25SDK.framework.
I suggest you take a look at the sample application STSW-ST25IOS005, which uses st25sdkframework.


6. My current experiment
Your approach is quite good. it shows initiative and a good understanding of how the SDK is structured. However, it is not necessary.

The main issue is that you started from a setup that was originally using the static library and tried to move it to st25sdkFramework. The framework integration should be used as provided, without manually re-adding headers or excluding .m files from the SDK sources.

Please refer to the STSW-ST25IOS005 sample application, which is the correct example for using st25sdkFramework.

Question 1 — Why is libST25SDK.a present?
Please, ref  to STSW-ST25IOS005 sample application where only st25sdkFramework is present and no libST25SDK

Question 2
 — Do I actually need to build J2ObjC 2.4?

No, you do not need to build J2ObjC 2.4 if you are using st25sdkframework directly.

The framework already includes the required headers and the embedded libraries, so no additional J2ObjC build step is needed.

Question 3 — What is the correct integration process?

1. Add st25sdkFramework.framework
2. Add/embed the framework in the application
3. Configure the required framework/header search paths

Question 4 — Are my current steps valid?
Not needed if you use the st25sdkframework directly.

Question 5 — What is the purpose of the SDK .m files?

These .m files are not needed when you integrate the prebuilt st25sdkFramework directly.

If the framework is already provided, its implementation is already compiled inside it, so the .m files from the sample’s include folder should be ignored. Their presence in the NFC Tap sample looks like a leftover or an artifact from the original development setup, where the project used the static library flow.

So, for the prebuilt framework integration:

  • use the framework,
  • keep the required .h headers,
  • do not compile the SDK .m files separately.

Question 6 — What is the correct way to access headers that are not in the umbrella header?

Yes, you can add them manually to the umbrella header.

If some SDK headers such as Type1Command.h or Type1Tag.h are part of the SDK but not exposed by st25sdkFramework.h, adding the missing imports manually is a valid workaround to make those APIs visible in your project.

That said, if you are using the prebuilt framework as intended, the recommended approach is to rely on the headers already exposed by the framework sample and use the same integration pattern as in STSW-ST25IOS005.

8. What I am ultimately trying to understand

Yes — if you use the prebuilt st25sdkFramework.framework, you do not need to build J2ObjC 2.4 separately. The prebuilt framework already contains the required J2ObjC pieces.

As for the NFC Tap sample: it contains libST25SDK.a and the st25sdklib/include source files because that sample was built around the static library integration flow, not the prebuilt framework flow. In other words, it reflects a different packaging/setup and is not the same integration model as st25sdkFramework.framework.

So the short answer is:

  • Prebuilt framework: self-contained, no separate J2ObjC 2.4 build needed.
  • NFC Tap sample: uses the static-library-based structure, which is why you see libST25SDK.a and the source/include files.


Thank you for your interest and for your detailed questions. I hope the explanations provided have been clear and helpful.​​​​​​​